IMPUUO page# 0001 next
2: COMMENT ⊗   VALID 00061 PAGES
3: C REC  PAGE   DESCRIPTION
4: C00001 00001
5: C00007 00002    SUBTTL IMP UUO-LEVEL CODE - JAM, SEPT '71
6: C00010 00003     MORE MTAPE UUO CODES
7: C00012 00004     POSITIONS IN USER TABLE OF VARIOUS QUANTITIES
8: C00013 00005     UUO DISPATCH TABLE
9: C00014 00006     INITIALIZE ROUTINE
10: C00017 00007     MTAPE DISPATCH
11: C00019 00008     TERMINATE CONNECTION
12: C00021 00009     REINITIALIZE THE IMP SYSTEM, BRING UP THE IMP
13: C00022 00010
14: C00024 00011     TEST AND CLEAR INTERRUPT BITS - SET SYSTEM DEFAULT TIMEOUTS
15: C00026 00012     LISTEN CODE
16: C00029 00013     LISTEN CODE - HERE HE WANTS TO LISTEN TO AN EXTANT SOCKET
17: C00032 00014     LISTEN - GET HERE WHEN THE SLOT IN THE TABLE IS OKED FOR CONNECTION
18: C00033 00015     CONNECT CODE - FIRST CHECK FOR A PENDING SOCKET, THEN SEND OUT A RFC
19: C00036 00016     CONNECT CODE. CHECK SOCKET FOR CLOSURE. IF CLOSED, WE MAY GO AHEAD AND USE IT
20: C00038 00017     CONNECT CODE. ROUTINE TO SET UP THE INDEX AND TRY TO WAIT FOR CONNECTION.
21: C00039 00018     DUMP. GIVE LOSER A DUMP OF THE MONITOR TABLES.
22: C00041 00019     ROUTINE TO GIVE LOSER HIS SOCKET NUMBERS
23: C00042 00020     ROUTINE TO WAIT FOR CONNECTION
24: C00044 00021     MTAPE 13 - SET ALLOCATION
25: C00046 00022     UUO TO SET ALLOCATION. HERE ALLOCATION HE WANTS IS IN AC2 & AC3
26: C00048 00023     HERE WE DECREMENT HIS ALLOCATION AND ASK FOR SOME BACK IF NEED BE
27: C00050 00024     MTAPE 14 - GIVE USER THE CURRENT ALLOCATIONS
28: C00051 00025     ROUTINE TO SEND AN INTERRUPT
29: C00052 00026     RELEAS CODE. SEND OUT CLSS IF NOT ALREADY.
30: C00054 00027     BUFFERED OUTPUT . . .
31: C00056 00028     ROUTINE TO ACTUALLY DO THE OUTPUT
32: C00059 00029     FULL WORD MODE OUTPUT - BYTE AT A TIME
33: C00063 00030     ROUTINE TO CORRECT WORD COUNT, ALLOCATION, AND SEND OFF MESSAGE
34: C00065 00031     BUFFERED OUTPUT. GET HERE TO DO A BLT INTO THE MESSAGE BUFFERS.
35: C00068 00032     HERE WE HAVE DECIDED TO SEND THE MESSAGE, WHETHER THERE IS MORE IN THE BUFFER OR NOT
36: C00069 00033     IMP INPUT UUOS - BUFFERED MODE AND DUMP MODE
37: C00071 00034     COMMON INPUT ROUTINE.
38: C00074 00035     COMMON INPUT ROUTINE. READ DATA OUT OF INPUT LIST AND INTO USER CORE
39: C00077 00036     HERE WE HAVE CORRECTED THE WORD COUNTS IN THE BUFFERS AND ARE READY TO DO THE INPUT
40: C00080 00037     CLOSE CODE. DOESN'T REALLY DO MUCH EXCEPT FLUSH BUFFERS AND SEND OUT CLSS
41: C00082 00038     UTILITY ROUTINES FOR UUO-LEVEL STUFF. ROUTINES TO SEND STR OR RTS
42: C00083 00039     ROUTINE TO MAKE UP AN RFC BLOCK. MUST HAVE BLOCK IN AC1, CONNECTION INDEX IN AC3,
43: C00085 00040     ERROR ROUTINE FOR NO CONNECTION
44: C00086 00041     ROUTINE TO SEND OUT A MESSAGE AT UUO LEVEL. WAITS FOR
45: C00089 00042     ROUTINE TO WAIT FOR THE LINK TO CLEAR
46: C00090 00043     ROUTINE TO BLESS UUO LEVEL OUTPUTS BASED ON HOST STATUS.
47: C00091 00044     ROUTINE TO CHECK FOR PROPER CONNECTION AND HOST DEAD.
48: C00094 00045     ROUTINE TO INITIALIZE A CONNECTION
49: C00095 00046     ROUTINE TO REQUEUE SOMEONE INTO THE RUN QUEUE
50: C00097 00047     ROUTINE TO WAIT FOR ALLOCATION
51: C00099 00048     ROUTINE TO GET LINK TABLE INDEX FROM A DDB POINTER - SEND SIDE
52: C00100 00049     THIS IS CALLED AT CONNECT AND LISTEN TO DETERMINE
53: C00102 00050     FREE STORAGE MANAGER FOR IMP SERVICE
54: C00104 00051     HERE WE CAN'T GET FS FROM THE SYSTEM, SEE IF WE CAN SCROUNGE A BLOCK
55: C00105 00052     ROUTINE TO RELEASE FREE STORAGE
56: C00107 00053     ROUTINE TO ASSIGN A NEW LINK NUMBER
57: C00109 00054     ROUTINE TO SEE IF A TABLE ENTRY MAY BE CLEARED.
58: C00110 00055     ROUTINE TO SEARCH DOWN QUEUED RFC LIST FOR AN RFC THAT MATCHES OUR SOCKET
59: C00112 00056     ROUTINE TO APPEND AN ENTIRE RFC QUEUE ONTO ILIST
60: C00114 00057     ROUTINE TO GO INTO A WAIT STATE BUT START A COUNTDOWN TOO
61: C00116 00058     ROUTINE TO WAIT FOR A MATCHING CLS
62: C00117 00059     ROUTINE TO SEND AN ALLOCATION
63: C00119 00060     ROUTINE TO CHECK AND SEND INITIAL ALLOCATION
64: C00121 00061     ROUTINE TO SEND OUT A SEND-SIDE CLS FROM UUO LEVEL
65: C00123 ENDMK
66: C⊗;
    IMPUUO page# 0002 next  prev
68: SUBTTL IMP UUO-LEVEL CODE - JAM, SEPT '71
69: 
70: ; THE NON-STANDARD UUOS WILL BE MTAPE UUOS
71: ; THE ADDRESS OF THE MTAPE POINTS TO A BLOCK
72: ; THE FIRST WORD OF THE BLOCK IS THE FUNCTION CODE
73: ; THAT DETERMINES WHAT TO DO AND HOW TO INTERPRET ANY OTHER WORDS IN THE BLOCK
74: ; FUNCTION=0            ; CONNECT
75: ;       1               ; STATUS BITS ARE PLACED HERE UPON RETURN
76: ;       2               ; LOCAL SOCKET NUMBER. 32 BITS RIGHT-ADJUSTED
77: ;       3               ; WAIT FLAG. -1 FOR WAIT FOR CONNECTION.
78: ;       4               ; BYTE SIZE, OR IF SENDING, BYTE SIZE IS STORED HERE
79: ;       5               ; FOREIGN SOCKET NUMBER
80: ;       6               ; HOST NUMBER IS PLACED HERE
81: ; FUNCTION=1            ; LISTEN
82: ;       1               ; STATUS BITS ARE PLACED HERE
83: ;       2               ; LOCAL SOCKET NUMBER
84: ;       3               ; WAIT FLAG
85: ;       4               ; BYTE SIZE OF CONNECTION. STORED HERE IF SEND
86: ; FUNCTION=2            ; STATUS
87: ;       1               ; STATUS BITS ARE PLACED HERE FOR SEND SIDE
88: ;       2               ; RECEIVE SIDE STATUS BITS ARE PLACED HERE
89: ; FUNCTION=3            ; TERMINATE
90: ;       1               ; STATUS BITS ARE PLACED HERE
91: ;       2               ; LOCAL SOCKET NUMBER
92: ;       3               ; WAIT FLAG
93: ; FUNCTION=4            ; WAIT FOR CONNECTION COMPLETE
94: ;       1               ; STATUS IS RETURNED HERE
95: ;       2               ; NEEDS SOCKET NUMBER HERE
96: ; FUNCTION=5            ; DUMP. DUMPS MONITOR TABLES
97: ;       1               ; NUMBER OF WORDS OF TABLES DESIRED
98: ;       2               ; ADDRESS OF PLACE TO PUT TABLES
99: ; FUNCTION=6            ; WAKEUP. VALID ONLY IF AT I-LEVEL. USEFUL FOR
100: ;                       ; WAKING UP PROCESS IN WAIT STATE DUE TO IMP.
101: ; FUNCTION=7            ; GET SOCKET NUMBERS AND HOST NUMBER
102: ;       1               ; HOST-LINK NUMBER, SEND SIDE
103: ;       2               ; LOCAL SEND SOCKET
104: ;       3               ; FOREIGN RECEIVE SOCKET
105: ;       4               ; HOST-LINK NUMBER FOR RECEIVE SIDE
106: ;       5               ; LOCAL RECEIVE SOCKET
107: ;       6               ; FOREIGN SEND SOCKET
108: ; FUNCTION=8.           ; SKIP IF ANY INPUT IS PRESENT
109: ; FUNCTION=9.           ; SEND INTERRUPT
110: ;       1               ; STATUS BITS RETURNED HERE
111: ;       2               ; NEED SOCKET NUMBER HERE
112: ; FUNCTION=10.          ; RESSURECT IMP IF DOWN
113: ; FUNCTION=11.          ; BLESS THIS HOST
114: ;       1               ; HOST NUMBER REQUIRED HERE
    IMPUUO page# 0003 next  prev
116: ; MORE MTAPE UUO CODES
117: 
118: ; FUNCTION=12.          ; TEST AND CLEAR INTERRUPT BITS
119: ;       1               ; SEND SIDE. 0 FOR NO INT., -1 FOR INT. PRESENT
120: ;       2               ; RECEIVE SIDE. 0 FOR NO INT., -1 FOR INT. PRESENT
121: ; FUNCTION=13.          ; SET ALLOCATION
122: ;       1               ; FUNCTION CODE. 0 NORM, 1 FOR SYS MAX, 2 FOR MIN
123: ;       2               ; NUMBER OF BITS OF ALLOCATION
124: ;       3               ; NUMBER OF MESSGES OF ALLOCATION
125: ; FUNCTION=14.          ; WHAT ARE THE ALLOCATIONS
126: ;       1               ; NUMBER OF BITS WE HAVE ALLOCATED HIM
127: ;       2               ; NUMBER OF MESSAGES WE HAVE ALLOCATED HIM
128: ;       3               ; NUMBER OF BITS HE HAS LEFT
129: ;       4               ; NUMBER OF MESSAGES HE HAS LEFT
130: ;       5               ; NUMBER OF BITS IN FREE STORAGE
131: ;       6               ; NUMBER OF MESSAGES IN FREE STORAGE
132: ;       7               ; NUMBER OF BITS HE HAS ALLOCATED US
133: ;       10              ; NUMBER OF MESSAGES HE HAS ALLOCATED US
134: ; FUNCTION=15.          ; SET TIMEOUTS
135: ;       1               ; WORD OF 6-BIT BYTES. GIVES NUMBER OF 2-SECOND UNITS
136: ;                       ; FOR TIMEOUTS ON CLS, RFNM, ALL, RFC, OR INP
137: ;                       ; 0 MEANS WAIT INDEFINITELY
138: ; FUNCTION=16.          ; GET TIMEOUTS
139: ;       1               ; CURRENT TIMEOUT WORD WILL BE PLACED HERE
    IMPUUO page# 0004 next  prev
141: ; POSITIONS IN USER TABLE OF VARIOUS QUANTITIES
142: 
143: STLOC←←1        ; STATUS WORD LOCATION
144: LSLOC←←2        ; LOCAL SOCKET LOCATION
145: WFLOC←←3        ; WAIT FLAG
146: BSLOC←←4        ; BYTE SIZE LOCATION
147: FSLOC←←5        ; FOREIGN SOCKET LOCATION
148: HLOC←←6         ; HOST NUMBER LOCATION
149: 
150: ; ERROR CODES
151: ; EVERYONE WHO RETURNS STATUS BITS MAY RETURN AN ERROR CODE INSTEAD
152: 
153: SIU←←1          ; SOCKET IN USE
154: CCS←←2          ; CAN'T CHANGE SOCKET AFTER RFC DONE
155: SYS←←3          ; HORRIBLE SYSTEM ERROR
156: NLA←←4          ; NO LINK AVAILABLE
157: ILB←←5          ; ILLEGAL BYTE SIZE
158: IDD←←6          ; IMP DEAD
    IMPUUO page# 0005 next  prev
160: ; UUO DISPATCH TABLE
161: 
162:         JRST IMPCLR
163:         JRST IMPSET
164:         JRST IMPINI
165:         JRST CPOPJ
166: IMPDSP:
167:         JRST IMPRLS     ; RELEASE
168:         JRST CLSO       ; CLOSE OUTPUT
169:         JRST BUFO       ; BUFFERED OUTPUT
170:         JRST BUFI       ; BUFFERED INPUT
171:         JRST CPOPJ1     ; ENTER
172:         JRST CPOPJ1     ; LOOKUP
173:         JRST DMPO       ; DUMP MODE OUTPUT
174:         JRST DMPI       ; DUMP MODE INPUT
175:         JRST CPOPJ      ; USETO
176:         JRST CPOPJ      ; USETI
177:         JRST CPOPJ      ; UGETF
178:         JRST CPOPJ1     ; RENAME
179:         JRST CLSI       ; CLOSE INPUT
180:         JRST CPOPJ      ; UTPCLR
181:         JRST MTAPE      ; MTAPE
    IMPUUO page# 0006 next  prev
183: ; INITIALIZE ROUTINE
184: 
185: IMPINI: SETZM IMPST             ; CLEAR DATA AREA
186:         MOVE AC1,[XWD IMPST,IMPST+1]
187:         BLT AC1,IMPEND-1
188:         MOVEI AC1,MAXNLK
189:         MOVEM AC1,LNKMAX
190:         MOVE AC1,[P1PID]
191:         MOVEM AC1,IMPPID
192:         MOVEI AC1,IBEGIN        ; INITIALIZE THE I-LEVEL DISPATCH ADDRESSES
193:         MOVEM AC1,IMPIDSP
194:         HRLOI AC1,377777        ; SET OUTPUT COUNT-DOWN TO RANDOM LARGE NUMBER
195:         MOVEM AC1,IMPOCT
196:         MOVEI AC1,DONOP
197:         MOVEM AC1,IMPODSP
198:         MOVEI AC1,10            ; GIVE A LITTLE WHILE FOR THE IMP RELAY TO COOL OFF
199:         MOVEM AC1,POLCNT
200:         MOVEI AC1,10            ; PICK UP A BUNCH OF SPARE FREE STORAGE BLOCKS
201:         MOVEM AC1,IMPSPN
202:         MOVE AC1,[XWD -INTPLN,IMPIPL-1]
203:         MOVEM AC1,IMPIPD
204:         MOVE AC1,[XWD -INTPLN,IMPOPL-1]
205:         MOVEM AC1,IMPOPD
206:         MOVEI AC1,LPTDDB
207:         HRLM AC1,DEVSER+DDBMDL  ; RELINK DEVICE DATA BLOCK CHAIN
208:         SKIPN IMPDIE            ; DO WE KEEP THE IMP DOWN TODAY?
209:         JRST IMPGAH
210:         SETOM IMPDEAD           ; YES
211:         MOVEI AC1,LPTDDB        ; LINK AROUND IMP DDB
212:         HRLM AC1,PTPDDB+DEVSER
213:         POPJ P,
214: 
215: IMPGAH: PUSHJ P,IMPGET          ; GET A FREE BLOCK FOR THE INPUT LIST
216:         HALT NOCORE
217:         MOVEM AC1,IMPSPARE
218:         CONO IMP,ODPIEN
219:         CONO IMP,STRIN!CLRWT!IDPIEN!IEPIEN!IMPCHN
220:         PUSHJ P,SNDNOP          ;SEND THE IMP 4 NOPS
221:         PUSHJ P,IMPGET          ; GET A FREE BLOCK FOR SENDING RESETS TO EVERYONE
222:         HALT NOCORE
223:         PUSHJ P,CLRBLK
224:         MOVEI AC2,377
225:         DPB AC2,SRCP            ; PUT IN BIGGEST HOST NUMBER
226:         MOVEI AC2,10
227:         DPB AC2,SIZEP           ; PUT IN BYTE SIZE
228:         MOVEI AC2,1
229:         DPB AC2,COUNTP          ; PUT IN BYTE COUNT
230:         MOVSI AC2,(<BYTE (8)RST>)
231:         MOVEM AC2,TDATA+2(AC1)  ; PUT IN RST OPCODE
232:         MOVEI AC2,3
233:         MOVEM AC2,TWC(AC1)      ; AND DATA WORD COUNT
234:         MOVEI AC2,377           ; LARGEST HOST NUMBER
235:         MOVEM AC2,RSTHST        ; SET UP NUMBER OF NEXT HOST TO BE RESET
236:         JRST CLKOUT     ; QUEUE RST BLOCK.  INT ROUTINE WILL DECREMENT HOST NUMBER
    IMPUUO page# 0007 next  prev
238: ; MTAPE DISPATCH
239: 
240: MTAPE:  XCTR    XR,[HRRZ TAC,(UUO)]     ;GET FUNCTION CODE.
241:         CAIL    TAC,MXUUO               ;FUNCTION IN BOUNDS?
242:         JRST    UUOERR                  ;NO. ILLEGAL FUNCTION.
243:         MOVE    TAC1,UUODSP(TAC)        ;GET THE DISPATCH ADDRESS
244:         SKIPE   IMPDEAD                 ;SKIP IF IMP IS UP
245:         JRST    MTAPE2                  ;IMP DOWN.
246:         JUMPG   TAC1,(TAC1)             ;JUMP IF LEGAL WITH IMP UP.
247:         JRST    UUOERR                  ;ILLEGAL WITH IMP UP.
248: 
249: MTAPE2: JUMPL   TAC1,(TAC1)             ;JUMP IF LEGAL WITH IMP DEAD.
250:         TLNE    TAC1,200000             ;DOES THIS MTAPE EXPECT STATUS BITS?
251:         JRST IDERR                      ;YES. GIVE THEM.
252:         POPJ P,                         ;NO JUST GIVE FAILURE RETURN
253: 
254: 
255: UUODSP: 200000,,CONECT                  ;0
256:         200000,,LISTEN                  ;1
257:         200000,,STATUS                  ;2
258:         200000,,TERMIN                  ;3
259:         SWAIT                           ;4
260:         DUMP                            ;5
261:         WAKE                            ;6
262:         GSOCKS                          ;7
263:         INPSKP                          ;10
264:         200000,,SNDINT                  ;11
265:         400000,,NEWINI                  ;12 ONLY IF IMP DEAD
266:         CPOPJ   ;CHKSIT                 ;13 BLESS
267:         TSINT                           ;14
268:         USETAL                          ;15
269:         UGETAL                          ;16
270:         USETTM                          ;17
271:         UGETTM                          ;20
272: MXUUO←←.-UUODSP
    IMPUUO page# 0008 next  prev
274: ; TERMINATE CONNECTION
275: 
276: TERMIN: XCTR    XR,[MOVE AC2,LSLOC(UUO)]
277:         XCTR    XW,[SETZM STLOC(UUO)]
278:         PUSHJ P,GETIDX
279:         POPJ P,
280:         MOVEI AC1,(DDB)
281:         SKIPE IMPDDB-1(AC3)             ; IF NOBODY HOME, LET HIM KILL IT
282:         CAMN AC1,IMPDDB-1(AC3)          ; IS IT OURS?
283:         JRST TEROK
284:         PUSHJ P,TTYERR
285:         PUSHJ P,INLMES
286:         ASCIZ /CAN'T TERMINATE SOMEONE ELSE'S SOCKET!
287: /
288: TTYSTG: MOVSI IOS,USRB
289:         ORB IOS,DEVIOS(DDB)
290:         JRST TTYSTR
291: 
292: TEROK:  TRNE AC2,1                      ; USE DIFFERENT CLOSE ROUTINE IF SEND SIDE
293:         JRST TERS
294:         PUSHJ P,URCLS                   ; SEND OUT THE CLS
295: TERW:   XCTR    XR,[SKIPE WFLOC(UUO)]   ; DOES HE WANT TO WAIT FOR IT?
296:         PUSHJ   P,TCLSW                 ; YES, DO A TIMED CLS WAIT
297:         XCTR    XR,[MOVE AC2,LSLOC(UUO)]        ; NOW GET THE CONNECTION INDEX AGAIN
298:         PUSHJ   P,GETIDX
299:         POPJ    P,
300:         MOVE    AC1,IMPSTB-1(AC3)
301:         XCTR    XW,[MOVEM AC1,STLOC(UUO)]
302:         POPJ    P,
303: 
304: TERS:   PUSHJ P,USCLS
305:         JRST TERW
    IMPUUO page# 0009 next  prev
307: ; REINITIALIZE THE IMP SYSTEM, BRING UP THE IMP
308: 
309: NEWINI: SKIPN   AC3,FFLNK       ;SEE IF THERE ARE ANY LINKS STILL ACTIVE
310:         JRST    NEWIN1
311: NEWIN2: SKIPN   AC2,IMPDDB-1(AC3)
312:         JRST    NEWIN3
313:         CAIE    AC2,(DDB)
314:         JRST    NEWLOS
315: NEWIN3: SOJGE   AC3,NEWIN2
316: NEWIN1: PUSHJ   P,DISDATE
317:         PUSHJ   P,DISJOB        ;BLAME IT ON THE STONES.
318:         PUSHJ   P,DISTAB
319:         MOVE    TAC1,PRJPRG(J)  ;GET THE NAME OF LOSER.
320:         PUSHJ   P,DISSIX
321:         PUSHJ   P,DISMES
322:         ASCIZ   / IS ATTEMPTING TO RESSURECT THE IMP.
323: /
324:         SETZM   IMPDIE
325:         JRST    IMPINI
326: 
327: NEWLOS: PUSHJ   P,TTYERR
328:         PUSHJ   P,INLMES
329:         ASCIZ   /LINKS STILL ACTIVE
330: /
331:         JRST    TTYSTG
    IMPUUO page# 0010 next  prev
    IMPUUO page# 0011 next  prev
334: ; TEST AND CLEAR INTERRUPT BITS - SET SYSTEM DEFAULT TIMEOUTS
335: ; RETURNS FLAG FOR SEND SIDE IN 1(UUO), RECEIVE SIDE IN 2(UUO)
336: 
337: TSINT:  ANDI    DDB,-1
338:         XCTR    XW,[SETZM 1(UUO)]
339:         XCTR    XW,[SETZM 2(UUO)]
340:         SKIPN   AC3,FFLNK
341:         POPJ    P,
342: TSINLP: CAMN DDB,IMPDDB-1(AC3)
343:         JRST TSINDF
344: TSINCR: SOJG AC3,TSINLP
345:         POPJ P,
346: 
347: TSINDF: MOVE AC2,IMPLS-1(AC3)
348:         MOVE AC1,IMPSTB-1(AC3)
349:         TLZE AC1,INTINS
350:         XCTR    XW,[SETOM 1(UUO)]
351:         TLZE    AC1,INTINR
352:         XCTR    XW,[SETOM 2(UUO)]
353:         MOVEM AC1,IMPSTB-1(AC3)
354:         JRST TSINCR
355: 
356: ; SET SYSTEM DEFAULT TIMEOUTS. PUT WORD OF 6-BIT FIELDS IN 1(UUO).
357: ; THE FIELDS ARE IN UNITS OF 2-SECONDS. I.E., THE MAXIMUM WAIT IS 126 SECONDS
358: ; AND THE MINIMUM WAIT IS 2 SECONDS.
359: 
360: USETTM: XCTR    XR,[MOVE AC1,1(UUO)]
361:         MOVEM   AC1,TIMES(DDB)
362:         POPJ    P,
363: 
364: ; ROUTINE TO GET CURRENT TIMEOUTS
365: 
366: UGETTM: MOVE AC1,TIMES(DDB)
367:         XCTR    XW,[MOVEM AC1,1(UUO)]
368:         POPJ P,
    IMPUUO page# 0012 next  prev
370: ; LISTEN CODE
371: 
372: LISTEN: XCTR XR,[MOVE AC2,LSLOC(UUO)]
373:         PUSHJ P,NSCHECK
374:         XCTR XR,[MOVE AC2,LSLOC(UUO)]
375:         PUSHJ P,GETIDX
376:         JRST LISTN2             ; NO KNOWN SOCKET. MAKE US WAIT.
377:         JRST LISTNG             ; KNOWN SOCKET. WHAT'S THIS?
378: 
379: LISTN2: AOS AC3,FFLNK           ; PICK UP NEW LINK NUMBER
380:         CAILE AC3,MAXNLK
381:         JRST LISNLK             ; NO LINK AVAILABLE
382: LISTN4: SETZ DAT,               ; ZERO HOST-LINK NUMBER
383:         SETO TEM,               ; MARK FOREIGN SOCKET UNUSED
384:         PUSHJ P,CLRSKT
385: CHKWAT: MOVSI AC2,RFCR          ; HAVE WE RECEIVED A REQUEST FOR CONNECTION?
386:         TDNN AC2,IMPSTB-1(AC3)
387:         JRST WAIT               ; NO, WAIT FOR ONE
388:         MOVSI AC2,RFCS          ; YES, HAS IT BEEN ACKNOWLEDGED?
389:         TDNN AC2,IMPSTB-1(AC3)
390:         PUSHJ P,SNDRFC          ; NO, DO SO NOW AND LEAVE WITHOUT WAITING
391:         JRST SETST              ; HAS CHANGED, DON'T WAIT
392: 
393: WAIT:   XCTR XR,[SKIPN WFLOC(UUO)]
394:         JRST SETST              ; NO WAIT, JUST SET STATUS WORD AND RETURN
395:         MOVNI TAC,IOWQ
396:         MOVEM TAC,JOBQUE(J)
397:         MOVSI IOS,RFCW          ; NOTE THAT WE ARE WAITING FOR CONNECTION
398:         ORM IOS,DEVIOS(DDB)
399:         LDB TEM,RFCTP           ; PICK UP RFC WAIT TIME
400:         PUSHJ P,TW              ; DO A TIMED WAIT IF WAIT TIME≠0. OTHERWISE WAIT FOREVER.
401:         JFCL                    ; IGNORE ERROR RETURN, GIVE LOSER STATUS BITS
402: SETST:  XCTR XR,[MOVE AC2,LSLOC(UUO)]
403:         PUSHJ P,GETIDX
404:         JRST NOCONN             ; HELP, LINK DISSAPEARED!
405:         MOVE TAC,IMPFS-1(AC3)
406:         XCTR XW,[MOVEM TAC,FSLOC(UUO)]
407:         MOVE AC2,IMPBS-1(AC3)   ; GIVE HIM BYTE SIZE FOR KICKS
408:         XCTR XW,[MOVEM AC3,BSLOC(UUO)]
409:         MOVE AC2,LNKTAB-1(AC3)  ; PICK UP HOST NUMBER
410:         LSH AC2,-10             ; RIGHT-ADJUST IT
411:         XCTR XW,[MOVEM AC2,HLOC(UUO)]
412: STST:   MOVE AC2,IMPSTB-1(AC3)
413:         TLZ AC2,ANYC            ; NOTE WE ARE GIVING HIM UP-TO-DATE STATUS BITS
414:         MOVEM AC2,IMPSTB-1(AC3)
415:         XCTR XW,[MOVEM AC2,STLOC(UUO)]
416:         POPJ P,
    IMPUUO page# 0013 next  prev
418: ; LISTEN CODE - HERE HE WANTS TO LISTEN TO AN EXTANT SOCKET
419: 
420: LISTNG: MOVE AC1,IMPSTB-1(AC3)
421:         SKIPN TAC,IMPDDB-1(AC3) ; DOES IT HAVE A DDB?
422:         JRST LNODDB             ; NO, WE MIGHT BE ABLE TO CONNECT UP
423: SIUERR: MOVEI TAC,SIU           ; NO, SOCKET IN USE
424:         JRST DEPERC
425: 
426: LNODDB: TLNE AC1,CLSS
427:         JRST WCLS
428:         TLNN AC1,RFCR           ; HAS A STR BEEN RECEIVED?
429:         JRST LISTN4             ; NO, WAIT FOR ONE
430:         TLNN AC1,RFCS           ; YES, HAS A RTS BEEN RETURNED?
431:         JRST USRTSR             ; NO, RETURN A RTS AND WE ARE CONNECTED!
432: ILLST:  TELCTR(NILLST,<ILLEGAL STATE: STR AND RTS BUT NO DDB!>)
433: SYSERR: MOVEI TAC,SYS           ; GIVE HIM SYSTEM ERROR CODE
434: DEPERC: XCTR XW,[MOVEM TAC,STLOC(UUO)]
435:         POPJ P,
436: 
437: WCLS:   HRRZM DDB,IMPDDB-1(AC3)
438:         TLNN AC1,CLSR
439:         PUSHJ P,TCLSW           ; WAIT FOR THE MATCHING CLOSE FOR A WHILE
440:         XCTR XR,[MOVE AC2,LSLOC(UUO)]
441:         TLZ AC1,CLSS!CLSR!RFCR!RFCS
442:         MOVEM AC1,IMPSTB-1(AC3)
443:         MOVEM AC2,IMPLS-1(AC3)
444:         TRNN AC2,1              ; IS IT A SEND SOCKET?
445:         JRST LNOBS              ; NO, HE DOESN'T GET TO SET THE BYTE SIDE.
446:         ANDI AC1,77
447:         CAIG AC1,44             ; CHECK FOR LEGAL BYTE SIZE
448:         SKIPGE BPW(AC1)
449:         JRST UILLBS
450:         XCTR XR,[MOVE AC1,BSLOC(UUO)]
451:         MOVEM AC1,IMPBS-1(AC3)
452: LNOBS:  SETZM LNKTAB-1(AC3)     ; NOTE THAT THERE IS NO HOST NUMBER
453:         SETOM IMPFS-1(AC3)      ; OR FOREIGN SOCKET EITHER
454:         SKIPE AC1,IMPRFQ-1(AC3) ; ANY PENDING RFCS?
455:         PUSHJ P,DISPQ           ; RUN DOWN RFQ LIST FOR A STR THAT MATCHES OUR SOCKET
456:         JRST CHKWAT             ; NONE FOUND, WAIT FOR ONE
457:         JRST SETST              ; ONE FOUND AND PROCESSED, RETURN TO LOSER
458: 
459: UILLBS: MOVEI TAC,ILB
460:         JRST DEPERC
461: 
462: IDERR:  MOVEI TAC,IDD
463:         JRST DEPERC
    IMPUUO page# 0014 next  prev
465: ; LISTEN - GET HERE WHEN THE SLOT IN THE TABLE IS OKED FOR CONNECTION
466: 
467: USRTSR: HRRZM DDB,IMPDDB-1(AC3)
468: SNDRAL: XCTR XR,[MOVE AC2,LSLOC(UUO)]
469:         XCTR XR,[MOVE TEM,BSLOC(UUO)]
470:         TRNE AC2,1
471:         MOVEM TEM,IMPBS-1(AC3)          ; IF WE ARE SENDING SET BYTE SIZE
472:         PUSHJ P,SNDRFC                  ; SEND BACK A RTS
473:         JRST SETST                      ; GIVE HIM SOME STATUS BITS TOO
474: 
475: ; GET HERE IF THERE IS NO ROOM IN THE LINK TABLE FOR HIS LISTEN
476: 
477: LISNLK: SOS FFLNK
478:         MOVEI TAC,NLA           ; GIVE HIM "nO-LINK AVAILABLE" ERROR
479:         XCTR XW,[MOVEM TAC,STLOC(UUO)]
480:         POPJ P,
    IMPUUO page# 0015 next  prev
482: ; CONNECT CODE - FIRST CHECK FOR A PENDING SOCKET, THEN SEND OUT A RFC
483: 
484: CONECT: SKIPE IMPDEAD
485:         JRST IDERR
486:         XCTR XR,[MOVE AC2,LSLOC(UUO)]
487:         PUSHJ P,NSCHECK
488:         XCTR XR,[MOVE AC2,LSLOC(UUO)]
489:         PUSHJ P,GETIDX          ; SEE IF THIS SOCKET NUMBER EXISTS YET
490:         JRST MAKRFC             ; NO, SEND OUT RFC
491:         MOVE AC1,IMPSTB-1(AC3)  ; YES, SEE IF IT IS PENDING
492:         SKIPE TAC,IMPDDB-1(AC3) ; DOES IT ALREADY HAVE A DDB?
493:         JRST SIUERR             ; NO, SOCKET IN USE
494:         TLNE AC1,RFCR           ; HAVE WE RECEIVED A RFC?
495:         TLNE AC1,RFCS           ; HAS RFC BEEN SENT?
496:         JRST CHKCL              ; YES, SEE IF IT HAS BEEN CLOSED.
497:         XCTR XR,[MOVE TEM,FSLOC(UUO)]
498:         CAME TEM,IMPFS-1(AC3)
499:         JRST SIUERR
500:         XCTR XR,[MOVE TEM,HLOC(UUO)]
501:         LSH TEM,10
502:         XOR TEM,LNKTAB-1(AC3)   ; CHECK HOST NUMBERS
503:         TRNE TEM,177400
504:         JRST SIUERR             ; NO MATCH, SOCKET IN USE
505:         HRRZM DDB,IMPDDB-1(AC3)
506:         JRST SNDRAL             ; GO SEND ALLOCATION IF NECESSARY
    IMPUUO page# 0016 next  prev
508: ; CONNECT CODE. CHECK SOCKET FOR CLOSURE. IF CLOSED, WE MAY GO AHEAD AND USE IT
509: 
510: CHKCL:  TLNN AC1,CLSS
511:         JRST ILLST
512:         HRRZM DDB,IMPDDB-1(AC3)
513:         TLNN AC1,CLSR           ; HAVE WE RECEIVED A CLOSE?
514:         PUSHJ P,TCLSW           ; NO, WAIT FOR A WHILE FOR ONE
515:         XCTR XR,[MOVE AC2,LSLOC(UUO)]
516: CONSRL: TLZ AC1,CLSS!CLSR!RFCR!RFCS
517:         MOVEM AC1,IMPSTB-1(AC3)
518:         MOVEM AC2,IMPLS-1(AC3)  ; SET RECEIVE SOCKET NUMBER
519:         XCTR XR,[MOVE TEM,FSLOC(UUO)]
520:         MOVEM TEM,IMPFS-1(AC3)
521:         XCTR XR,[MOVE AC1,HLOC(UUO)]
522:         ANDI AC1,377
523:         LSH AC1,10
524:         MOVEM AC1,LNKTAB-1(AC3)
525:         TRNN AC2,1              ; SEND SOCKET?
526:         JRST CNOBS              ; NO, HE CAN'T SET BYTE SIZE
527:         XCTR XR,[MOVE AC1,BSLOC(UUO)]
528:         ANDI AC1,77
529:         CAIG AC1,44
530:         SKIPGE BPW(AC1)
531:         JRST UILLBS             ; ILLEGAL BYTE SIZE
532:         MOVEM AC1,IMPBS-1(AC3)
533: CNOBS:  SKIPE AC1,IMPRFQ-1(AC3) ; ANYONE WAITING?
534:         PUSHJ P,DISPQ           ; RUN DOWN LIST OF RFCS FOR ONE THAT MATCHES US
535:         JRST MSSRFC             ; NOONE WAITING, SEND OUT RFC
536:         JRST CONWAT             ; FOUND SOMEONE, GO SET USER UP
537: 
538: MSSRFC: PUSHJ P,SNDRFC          ; SEND OUT REQUEST FOR CONNECTION
539:         MOVE IOS,DEVIOS(DDB)
540:         TRNE IOS,IODERR!IODTER!HDEAD!RSET
541:         POPJ P,                 ; IF ERRORS, LEAVE NOW
542:         JRST CONWAT             ; WAIT FOR REPLY IF LOSER SO CHOSES
    IMPUUO page# 0017 next  prev
544: ; CONNECT CODE. ROUTINE TO SET UP THE INDEX AND TRY TO WAIT FOR CONNECTION.
545: 
546: CONWAT: XCTR XR,[MOVE AC2,LSLOC(UUO)]
547:         PUSHJ P,GETIDX          ; PICK UP CONNECTION INDEX AGAIN
548:         JRST NOCONN
549:         JRST CHKWAT
550: 
551: NOCONR: TELCTR(NNOCLW,<NO RETURN CLS SENT!>)
552:         JRST CONSRL
553: 
554: ; HERE WE INITIALIZE A SOCKET AND SEND OUT RFC
555: 
556: MAKRFC: XCTR XR,[MOVE TEM,FSLOC(UUO)]
557:         AOS AC3,FFLNK           ; GET NEW INDEX NUMBER
558:         CAILE AC3,MAXNLK
559:         JRST LISNLK
560:         XCTR XR,[MOVE DAT,HLOC(UUO)]
561:         ANDI DAT,377
562:         LSH DAT,10
563:         PUSHJ P,CLRSKT
564:         JRST MSSRFC
    IMPUUO page# 0018 next  prev
566: ; DUMP. GIVE LOSER A DUMP OF THE MONITOR TABLES.
567: 
568: DUMP:   XCTR XR,[MOVE AC2,2(UUO)]
569:         MOVEI TAC1,(AC2)
570:         XCTR XRW,[MOVSS (AC2)]
571:         MOVEI AC3,(AC2)
572:         XCTR XR,[ADD AC3,1(UUO)]
573:         XCTR XRW,[MOVSS -1(AC3)]
574:         XOR AC3,TAC1
575:         JUMPL AC3,ADRERR
576:         PUSHJ P,DOLOC           ; RELOCATE ADDRESS IN TAC1, PUT RESOLT IN DSER
577:         HRLI DSER,SYSTBS
578:         HRRZI AC3,-1(DSER)
579:         XCTR XR,[ADD AC3,1(UUO)]
580:         BLT DSER,(AC3)
581:         POPJ P,
582: 
583: ; GIVE LOSER THE STATUS OF HIS CONNECTION
584: 
585: STATUS: PUSHJ P,UUSIDX
586:         JRST STAT1
587:         MOVSI AC2,ANYC
588:         ANDCAB AC2,IMPSTB-1(AC3)
589:         XCTR XW,[MOVEM AC2,1(UUO)]
590:         JRST STAT2
591: 
592: STAT1:  XCTR XW,[SETZM 1(UUO)]
593: STAT2:  PUSHJ P,UURIDX
594:         JRST STAT3
595:         MOVSI AC2,ANYC
596:         ANDCAB AC2,IMPSTB-1(AC3)
597:         XCTR XW,[MOVEM AC2,2(UUO)]
598:         POPJ P,
599: 
600: STAT3:  XCTR XW,[SETZM 2(UUO)]
601:         POPJ P,
602: 
603: ; WAKE UP MONITOR IF WAITING FOR IMP. SETS TMO IN IOS TO INDICATE ERROR CONDITION
604: 
605: WAKE:   SKIPN INTACT
606:         POPJ P,
607:         MOVE IOS,DEVIOS(DDB)
608:         TLNN IOS,ANYW
609:         POPJ P,
610:         TRO IOS,TMO
611:         MOVEM IOS,DEVIOS(DDB)
612:         JRST QRUN
    IMPUUO page# 0019 next  prev
614: ; ROUTINE TO GIVE LOSER HIS SOCKET NUMBERS
615: 
616: GSOCKS: PUSHJ P,UUSIDX
617:         JRST GSOCKA
618:         PUSHJ P,DMPTBS          ; DUMP THEM INTO HIS CORE IMAGE
619: GSOCKB: ADDI UUO,3
620:         PUSHJ P,UURIDX          ; ANY RECEIVE SIDE?
621:         JRST ZTAB               ; NO, CLEAR CELLS
622:         JRST DMPTBS             ; YES, DUMP THEM
623: 
624: GSOCKA: PUSHJ P,ZTAB
625:         JRST GSOCKB
626: 
627: ZTAB:   XCTR XW,[SETZM 1(UUO)]
628:         XCTR XW,[SETZM 2(UUO)]
629:         XCTR XW,[SETZM 3(UUO)]
630:         POPJ P,
631: 
632: DMPTBS: MOVE AC1,LNKTAB-1(AC3)
633:         XCTR XW,[MOVEM AC1,1(UUO)]
634:         MOVE AC1,IMPLS-1(AC3)
635:         XCTR XW,[MOVEM AC1,2(UUO)]
636:         MOVE AC1,IMPFS-1(AC3)
637:         XCTR XW,[MOVEM AC1,3(UUO)]
638:         POPJ P,
    IMPUUO page# 0020 next  prev
640: ; ROUTINE TO WAIT FOR CONNECTION
641: 
642: SWAIT:  XCTR XR,[MOVE AC2,LSLOC(UUO)]
643:         PUSHJ P,GETIDX
644:         JRST NOCONN
645:         MOVE AC1,IMPSTB-1(AC3)
646:         TLC AC1,RFCS!RFCR
647:         TLCE AC1,RFCS!RFCR
648:         TLNE AC1,CLSR!CLSS
649:         JRST SWSTST
650:         MOVNI AC1,IOWQ
651:         MOVEM AC1,JOBQUE(J)
652:         MOVSI IOS,RFCW
653:         ORM IOS,DEVIOS(DDB)
654:         LDB TEM,RFCTP           ; PICK UP RFC WAIT TIMEOUT PERIOD
655:         PUSHJ P,TW              ; DO A TIMED WAIT
656:         JRST NSW                ; TIMEOUT. NO CONNECTION
657:         MOVSI IOS,RFCW
658:         ANDCAB IOS,DEVIOS(DDB)
659:         JRST SWAIT              ; IF NO TIME-OUT, GO BACK AND MAKE SURE WE ARE CONNECTED
660: 
661: NSW:    MOVSI IOS,RFCW
662:         ANDCAB IOS,DEVIOS(DDB)  ; CLEAR BIT IN MEMORY
663:         POPJ P,                 ; IF TIMED OUT, GO BACK TO USER NOW
664: 
665: SWSTST: XCTR XW,[MOVEM AC1,STLOC(UUO)]
666:         POPJ P,
667: 
668: ; ROUTINE TO SKIP IF THERE IS ANY INPUT PRESENT
669: 
670: INPSKP: SKIPE INL(DDB)
671:         JRST CPOPJ1
672:         JRST INIALL             ; CHECK ON INITIAL ALLOCATION
    IMPUUO page# 0021 next  prev
674: ; MTAPE 13 - SET ALLOCATION
675: ; LOCATION 1 OF THE USER TABLE IS A CODE
676: ;       0 MEANS TAKE LOC 2 AS BIT ALLOCATION AND LOC 3 AS MESSAGE ALLOCATION
677: ;       1 MEANS SET ALLOCATION TO SYSTEM MAXIMUM
678: ;       2 MEANS SET ALLOCATION TO SYSTEM MINIMUM
679: ;       3 MEANS SET ALLOCATION TO SYSTEM DEFAULT
680: ; LOCATION 2 IS THE BIT ALLOCATION
681: ; LOCATION 3 IS THE MESSAGE ALLOCATION
682: 
683: USETAL: XCTR XR,[SKIPL TAC,1(UUO)]
684:         CAILE TAC,3             ; CHECK CODE FOR LEGAL RANGE
685:         JRST UUOERR
686:         JRST @USETTB(TAC)       ; DISPATCH TO RELEVANT ROUTINE
687: 
688: USETTB: USETSP
689:         USETMX
690:         USETMN
691:         USETDF
692: 
693: USETMX: MOVEI AC3,MAXBAL        ; PICK UP MAXIMUM ALLOCATIONS
694:         MOVEI AC2,MAXMAL
695:         JRST UCHKB
696: 
697: USETMN: MOVEI AC3,MINBAL
698:         MOVEI AC2,MINMAL
699:         JRST UCHKB
700: 
701: USETDF: MOVEI AC3,DEFBAL        ; USE DEFAULT ALLOCATIONS
702:         MOVEI AC2,DEFMAL
703:         JRST UCHKB
704: 
705: USETSP: XCTR XR,[MOVE AC3,2(UUO)]
706:         XCTR XR,[MOVE AC2,3(UUO)]
707:         CAIGE AC3,MINBAL        ; IS IT ABOVE MINIMUM ALLOCATION?
708:         MOVEI AC3,MINBAL        ; NO, GIVE HIM AT LEAST THIS MUCH
709:         CAILE AC3,MAXBAL        ; IS IT OVER MAXIMUM?
710:         MOVEI AC3,MAXBAL        ; NO, PUT A LID ON AT AT THE MAXIMUM
711:         CAIGE AC2,MINMAL        ; SAME FOR MESSAGE ALLOCATION
712:         MOVEI AC2,MINMAL
713:         CAILE AC2,MAXMAL
714:         MOVEI AC2,MAXMAL
715:         JRST UCHKB              ; PROCEED ON TO NEXT PAGE
    IMPUUO page# 0022 next  prev
717: ; UUO TO SET ALLOCATION. HERE ALLOCATION HE WANTS IS IN AC2 & AC3
718: ; PUT IT IN THE DDB AND SEND HIM A CONTROL MESSAGE IF NECESSARY
719: 
720: UCHKB:  MOVEM AC3,NHBA(DDB)     ; SET NOMINAL ALLOCATION
721:         MOVEM AC2,NHMA(DDB)
722:         LSH AC3,-1              ; SET HALFWAY MARKERS TOO FOR SPEED
723:         LSH AC2,-1
724:         MOVEM AC3,NHBA2(DDB)
725:         MOVEM AC2,NHMA2(DDB)
726:         PUSHJ P,UURIDX          ; PICK UP CONNECTION INDEX
727:         POPJ P,                 ; NONE YET, DON'T HAVE TO TELL HIM ANYTHING
728:         MOVE AC1,IMPSTB-1(AC3)  ; PICK UP STATUS BITS
729:         TLC AC1,RFCR!RFCS       ; SEE IF CONNECTION IS REALLY OPEN YET
730:         TLNN AC1,CLSS!CLSR      ; OR REALLY CLOSING
731:         TLNE AC1,RFCR!RFCS
732:         POPJ P,                 ; NOT REALLY OPEN FOR BUSINESS. LEAVE NOW
733:         MOVE UUO,LNKTAB-1(AC3)  ; SAVE HOST-LINK NUMBER HERE
734:         MOVE AC3,HBA(DDB)       ; NOW SEE IF HE NEEDS TO BE ALLOCATED RIGHT NOW
735:         MOVE AC2,HMA(DDB)
736:         CAMG AC3,NHBA(DDB)      ; ARE WE DECREASING HIS ALLOCATION?
737:         CAMLE AC2,NHMA(DDB)     ; OF EITHER FLAVOR?
738:         JRST AFSB               ; YES, ASK FOR SOME BACK
739:         ADD AC3,BIIL(DDB)
740:         ADD AC2,MIIL(DDB)
741:         CAML AC2,NHMA2(DDB)     ; IS HE PAST THE HALFWAY MARK?
742:         CAMGE AC3,NHBA2(DDB)    ; IN EITHER KIND OF ALLOCATION?
743:         PUSHJ P,SNDBAL          ; YES, SEND HIM SOME MORE
744:         POPJ P,                 ; END OF UUO
    IMPUUO page# 0023 next  prev
746: ; HERE WE DECREMENT HIS ALLOCATION AND ASK FOR SOME BACK IF NEED BE
747: 
748: AFSB:   SUB AC3,NHBA(DDB)       ; GET AMOUNT OF BIT ALLOCATION TO ASK FOR
749:         SKIPGE AC3
750:         SETZ AC3,               ; POSITIVE ONLY
751:         SUB AC2,NHMA(DDB)       ; SAME FOR MESSAGE ALLOCATION
752:         SKIPGE AC2
753:         SETZ AC2,
754:         LSH AC2,7               ; SET UP FOR GETTING 7-BIT FRACTION
755:         LSH AC3,7
756:         IDIV AC2,HMA(DDB)       ; DIVIDE WHAT WE WANT BACK BY WHAT HE HAS
757:         IDIV AC3,HBA(DDB)
758:         LSH AC2,8
759:         ORI AC2,(AC3)           ; PACK THEM INTO ONE WORD
760:         HRLI AC2,GVB6          ; PUT IN OPCODE
761:         PUSHJ P,IMPGET          ; GET SOME FREE STORAGE FOR A MESSAGE
762:         JRST NOCORE
763:         LSH AC2,4               ; LEFT JUSTIFY THE COMMAND WORD
764:         MOVEM AC2,TDATA+2(AC1)  ; AND PLACE INTO OUTPUT BLOCK
765:         SETZM TDATA(AC1)        ; CLEAR OUT JUNK IN LEADER
766:         SETZM TDATA+1(AC1)
767:         MOVEI AC2,3             ; SET WORD COUNT
768:         MOVEM AC2,TWC(AC1)
769:         DPB UUO,OLINKP          ; PUT IN THE LINK NUMBER
770:         ANDCMI UUO,177400       ; NOW THE HOST NUMBER WITH LINK SET TO ZERO
771:         DPB UUO,ELINKP
772:         MOVEI AC2,10
773:         DPB AC2,SIZEP
774:         MOVEI AC2,4
775:         DPB AC2,COUNTP
776:         JRST UUOQ               ; AND AWAY IT GOES!
    IMPUUO page# 0024 next  prev
778: ; MTAPE 14 - GIVE USER THE CURRENT ALLOCATIONS
779: 
780: UGETAL: MOVE TAC,NHBA(DDB)
781:         XCTR XW,[MOVEM TAC,1(UUO)]
782:         MOVE TAC,NHMA(DDB)
783:         XCTR XW,[MOVEM TAC,2(UUO)]
784:         MOVE TAC,HBA(DDB)
785:         XCTR XW,[MOVEM TAC,3(UUO)]
786:         MOVE TAC,HMA(DDB)
787:         XCTR XW,[MOVEM TAC,4(UUO)]
788:         MOVE TAC,BIIL(DDB)
789:         XCTR XW,[MOVEM TAC,5(UUO)]
790:         MOVE TAC,MIIL(DDB)
791:         XCTR XW,[MOVEM TAC,6(UUO)]
792:         MOVE TAC,BAL(DDB)
793:         XCTR XW,[MOVEM TAC,7(UUO)]
794:         MOVE TAC,MAL(DDB)
795:         XCTR XW,[MOVEM TAC,10(UUO)]
796:         POPJ P,
    IMPUUO page# 0025 next  prev
798: ; ROUTINE TO SEND AN INTERRUPT
799: 
800: SNDINT: XCTR XR,[MOVE AC2,LSLOC(UUO)]
801:         PUSHJ P,IMPGET
802:         JRST NOCORE
803:         XCTR XW,[SETZM STLOC(UUO)]
804:         PUSHJ P,GETIDX
805:         JRST IMPREL
806:         MOVE DAT,IMPSTB-1(AC3)
807:         XCTR XW,[MOVEM DAT,STLOC(UUO)]
808:         SETZM TDATA(AC1)
809:         SETZM TDATA+1(AC1)
810:         SETZM TDATA+2(AC1)
811:         MOVEI DAT,10
812:         DPB DAT,SIZEP
813:         MOVEI DAT,2
814:         DPB DAT,COUNTP
815:         MOVEI DAT,3
816:         MOVEM DAT,TWC(AC1)
817:         MOVE DAT,LNKTAB-1(AC3)
818:         ANDI DAT,177400
819:         DPB DAT,ELINKP
820:         MOVE DAT,LNKTAB-1(AC3)
821:         DPB DAT,OLINKP
822:         MOVEI DAT,INS
823:         TRNN AC2,1
824:         MOVEI DAT,INR
825:         DPB DAT,OPCDP
826:         JRST UUOQ
    IMPUUO page# 0026 next  prev
828: ; RELEAS CODE. SEND OUT CLSS IF NOT ALREADY.
829: 
830: IMPRLS: SKIPL TIM(DDB)          ; TIME INITIALIZED?
831:         SOS TIMWAIT             ; YES, NOT ANY MORE
832:         SETOM TIM(DDB)
833:         SKIPE AC1,INL(DDB)      ; ANYTHING STILL ON INPUT LIST?
834:         PUSHJ P,RELBLS          ; YES, GIVE IT BACK
835:         SKIPE IMPDEAD
836:         JRST RLDI
837:         MOVE IOS,DEVIOS(DDB)
838:         TRNE IOS,BLOK
839:         PUSHJ P,RFNMWT          ; IF STILL DATA ON THE LINK, WAIT FOR IT
840:         PUSHJ P,UUSIDX
841:         JRST IMPRL3
842:         MOVE AC1,IMPSTB-1(AC3)
843:         TLNE AC1,RFCS
844:         TLNE AC1,CLSS
845:         JRST IMPRL1
846:         PUSHJ P,USCLS
847:         PUSHJ P,UUSIDX
848:         JRST IMPRL3
849: IMPRL1: SETZM IMPDDB-1(AC3)
850:         PUSHJ P,ZEROLK
851: IMPRL3: PUSHJ P,UURIDX
852:         POPJ P,
853:         MOVE AC1,IMPSTB-1(AC3)
854:         TLNE AC1,RFCS
855:         TLNE AC1,CLSS
856:         JRST IMPRL4
857:         PUSHJ P,URCLS
858:         PUSHJ P,UURIDX
859:         POPJ P,
860: IMPRL4: SETZM IMPDDB-1(AC3)
861:         JRST ZEROLK             ; RELEASE CONNECTION IF ALL CLSS ARE PROPERLY EXCHANGED
862: 
863: ; WE GET HERE IF THE IMP IS DEAD
864: 
865: RLDI:   PUSHJ P,UUSIDX          ; SEE IF HE HAS A SEND SOCKET
866:         JRST RLDI1
867:         SETZM IMPDDB-1(AC3)     ; YES, KILL IT
868:         PUSHJ P,ZEROLK
869: RLDI1:  PUSHJ P,UURIDX
870:         POPJ P,
871:         SETZM IMPDDB-1(AC3)
872:         JRST ZEROLK
    IMPUUO page# 0027 next  prev
874: ; BUFFERED OUTPUT . . .
875: 
876: BUFO:   PUSHJ P,UUOOOK          ; IS HOST ALIVE AND ALL?
877:         JRST UUXIT              ; NO, LEAVE WITH ERROR BITS
878:         HRRZ TAC1,DEVOAD(DDB)   ; PICK UP OUT BUFFER ADDRESS
879:         XCTR XR,[HRRZ TAC,1(TAC1)]      ; PICK UP WORD COUNT
880:         ADDI TAC1,2             ; MOVE POINTER TO DATA AREA
881:         PUSHJ P,NEWOX           ; DO TRANSFER USING USER ADDR IN TAC1 AND WD CT IN TAC
882:         PUSHJ P,ADVBFE          ; ADVANCE BUFFER
883:         JRST UUXIT
884:         JRST BUFO               ; TRY FOR ANOTHER ONE
885: 
886: ; DUMP MODE OUTPUT . . .
887: 
888: DMPO:   PUSHJ P,UUOOOK
889:         JRST UUXIT
890: DMPO1:  PUSHJ P,DMPCMD          ; RETURNS UPLEVEL WHEN DONE
891:         MOVNS TAC               ; GET POSITIVE WD CT IN TAC
892:         PUSH P,UUO
893:         PUSHJ P,NEWOX           ; DO TRANSFER
894:         POP P,UUO               ; GET PTR TO DMP MODE CMD LIST BACK
895:         AOJA UUO,DMPO           ; DO NEXT COMMAND
    IMPUUO page# 0028 next  prev
897: ; ROUTINE TO ACTUALLY DO THE OUTPUT
898: ; ENTER WITH WORD COUNT IN TAC AND USER ADDRESS IN TAC1
899: 
900: NEWOX:  JUMPE TAC,CPOPJ         ; LEAVE IF USER WORD COUNT=0
901:         ADD P,[XWD 1,1]         ; BUMP STACK FOR FULL WORD FLAG
902: OUTAGN: PUSHJ P,ALLOK           ; WAIT FOR ALLOCATION IF NECESSARY
903:         JRST SPOPJ              ; LEAVE ON ERRORS
904:         HRLI TAC1,440000        ; MAKE INPUT POINTER INTO BYTE POINTER
905:         MOVE IOS,IMPBS-1(AC3)   ; CONNECTION INDEX SET UP BY ALLOK
906:         DPB IOS,[POINT 6,TAC1,11]
907:         MOVE AC3,IOS
908:         MOVE AC3,BPW(AC3)       ; GET BITS PER WORD IN AC3
909:         IDIV AC3,IOS            ; AC3 NOW HAS BYTES PER WORD
910:         LDB IOS,[POINT 6,TAC1,11]
911:         SETOM (P)               ; ASSUME FULL WORD MODE
912:         CAIN IOS,8
913:         JRST GOBAAT             ; ALWAYS DO BYTE AT A TIME FOR 8 BIT BYTES
914:         MOVE TEM,BAL(DDB)       ; HOW MUCH ALLOCATION HAS HE GIVEN US?
915:         CAILE TEM,400           ; IF LESS THAN 8 WORDS, DO BYTE AT A TIME
916:         CAIGE TAC,10            ; IF LESS THAN 8 WORDS, IS MORE EFFICIENT TO GO BYTE AT A TIME
917:         JRST GOBAAT             ; BYTE AT A TIME
918:         JRST GOFW
919: 
920: GOBAAT: IMULI TAC,(AC3)         ; IF BYTE AT A TIME, CONVERT TO BYTE COUNT
921:         SETZM (P)               ; CLEAR FULL WORD FLAG
922: GOFW:   MOVEI TEM,(AC3)         ; SAVE BYTES/WD IN TEM
923: NEWMSO: PUSHJ P,IMPGET          ; PICK UP FIRST BUFFER OF MESSAGE
924:         JRST NOCORE
925:         SETZM TDATA(AC1)        ; CLEAR SPARE BITS IN LEADER
926:         SETZM TDATA+1(AC1)
927:         PUSHJ P,UUSIDX          ; PICK UP THE LINK TABLE INDEX AGAIN
928:         JRST NOCONN
929:         MOVE IOS,LNKTAB-1(AC3)  ; PICK UP HOST-LINK NUMBER
930:         DPB IOS,ELINKP          ; PUT IN DESTINATION FIELD
931:         MOVE IOS,IMPBS-1(AC3)   ; PICK UP BYTE SIZE
932:         DPB IOS,SIZEP           ; SET INTO LEADER
933:         MOVE DAT,TLEN(AC1)      ; PICK UP LENGTH OF DATA PORTION OF BUFFER
934:         MOVEM DAT,TWC(AC1)      ; PUT INTO INITIAL WORD COUNT
935:         SUBI DAT,2              ; KNOCK OFF TWO FOR LEADER WORDS
936:         PUSH P,AC1              ; SAVE FIRST BLOCK OF MESSAGE ON STACK
937:         SETZB AC2,UCHN          ; CLEAR BYTE COUNT AND BIT COUNT
938:         SKIPGE -1(P)            ; FULL WORD OR BYTE AT A TIME?
939:         JRST BFOHW              ; FULL WORD MODE
    IMPUUO page# 0029 next  prev
941: ; FULL WORD MODE OUTPUT - BYTE AT A TIME
942: ; HERE IS THE ACTUAL OUTPUT LOOP
943: 
944: NBLOOP: PUSH P,AC1              ; PUT CURRENT BLOCK ON THE STACK
945:         IMULI DAT,(TEM)         ; DAT NOW HAS NUMBER OF FREE BYTES IN BUFFER
946:         SETZM TLINK(AC1)
947:         CAMN AC1,-1(P)          ; IS THIS THE FIRST BLOCK
948:         ADDI AC1,2              ; YES, BUMP POINTER PAST LEADER
949:         ADDI AC1,TDATA          ; BUMP BUFFER POINTER TO PAST OVERHEAD WORDS IN BLOCK
950:         HRLI AC1,440000         ; MAKE UP BYTE POINTER TO BUFFER
951:         DPB IOS,[POINT 6,AC1,11]
952: NWLOOP: ADD UCHN,IOS            ; ADD NUMBER OF BITS IN THIS NEXT TRANSFER
953:         CAIG UCHN,=7900         ; MORE THAN THE IMP CAN STAND?
954:         CAMLE UCHN,BAL(DDB)     ; HAVE WE OVERSHOT THE ALLOCATION?
955:         JRST OUTNOW             ; YES, SEND THE MESSAGE NOW AND WAIT FOR MORE ALLOCATION
956:         XCTR XLB,[ILDB DSER,TAC1]       ; PICK UP DATA BYTE
957:         IDPB DSER,AC1           ; PLACE INTO MESSAGE BUFFER
958:         ADDI AC2,1              ; BUMP BYTE COUNT
959:         CAIN IOS,8
960:         SOJA TAC,NWTNLP         ; CHECK FOR LAST WORD
961:         SOJLE TAC,ENDNOW        ; BUMP USER DATA COUNT, IF END OF MESSAGE, LEAVE
962: NWLOP1: SOJG DAT,NWLOOP         ; BUMP FREE BYTE COUNT
963:         PUSHJ P,IMPGET          ; GET ANOTHER BUFFER
964:         JRST NOCORE
965:         POP P,UUO               ; GET BACK LAST ONE
966:         HRRZM AC1,TLINK(UUO)    ; LINK NEW ONE TO OLD ONE
967:         MOVE DAT,TLEN(AC1)      ; FILL THE WORD COUNT
968:         MOVEM DAT,TWC(AC1)
969:         JRST NBLOOP
970: 
971: NWTNLP: JUMPE TAC,ENDNOW
972:         CAILE TAC,4             ; SKIP IF DOWN TO LAST WORD
973:         JRST NWLOP1
974:         CAIN TAC,4
975:         ADD TAC1,[400000,,1]    ; TAC1 ← 441000,,LAST WORD OF USER BUF
976:         MOVEI AC3,1
977:         LSH AC3,-1(TAC)         ; SHIFT TO BIT POSITION IN LAST WORD OF USER BUF
978:         XCTR XR,[TDNN AC3,(TAC1)]
979:         JRST NWLOP1             ; BIT CLEAR, OK TO USE THAT BYTE
980:         IBP TAC1                ; ADVANCE THE BYTE POINTER
981:         SOJA TAC,NWTNLP         ; TRY NEXT BYTE
982: 
983: OUTNOW: SUB UCHN,IOS            ; SUBTRACT OFF THE AMOUNT WE ADDED IN ALREADY
984:         PUSHJ P,UUFNO           ; FINISH OFF BLOCK
985:         PUSHJ P,ALLOK           ; DO WE HAVE ANY ALLOCATION?
986:         JRST SPOPJ                      ; NO, LEAVE NOW
987:         JRST NEWMSO             ; YES, MAKE UP A NEW MESSAGE
988: 
989: ENDNOW: SUBI DAT,1
990:         PUSHJ P,UUFNO
991: SPOPJ:  SUB P,[XWD 1,1]         ; NORMALIZE STACK WITHOUT CLOBBERING AN AC
992:         POPJ P,
    IMPUUO page# 0030 next  prev
994: ; ROUTINE TO CORRECT WORD COUNT, ALLOCATION, AND SEND OFF MESSAGE
995: 
996: UUFNO:  PUSH P,TEM
997:         SETZ TEM,
998: UUFILL: LDB AC3,[POINT 6,AC1,5]
999:         CAMGE AC3,IOS           ; IS POSITION GREATER THAN BYTE LENGTH?
1000:         JRST UUFIN              ; NO, WORD IS FULL
1001:         IDPB TEM,AC1            ; YES, FILL THE WORD WITH ANOTHER ZERO BYTE
1002:         JRST UUFILL
1003: 
1004: UUFIN:  MOVNS UCHN              ; NEGATE BIT COUNT
1005:         ADDM UCHN,BAL(DDB)      ; UPDATE ALLOCATION
1006:         SOS MAL(DDB)            ; NOTE ONE MORE MESSAGE GONE
1007:         MOVE AC1,-2(P)          ; PICK UP ADDRESS OF CURRENT BLOCK
1008:         MOVE TEM,(P)            ; PICK UP BYTES/WD FROM STACK
1009:         IDIVM DAT,TEM           ; CONVERT FREE BYTE COUNT TO FREE WORD COUNT IN TEM
1010:         MOVNS TEM               ; NEGATE FREE WORD COUNT
1011:         ADDM TEM,TWC(AC1)       ; MAKE INTO FULL WORD COUNT
1012:         MOVE AC1,-3(P)          ; PICK UP TOP TO MESSAGE
1013:         DPB AC2,COUNTP          ; SET BYTE COUNT THIS TRANSFER
1014:         PUSHJ P,UUOQ            ; SEND IT OUT
1015:         POP P,TEM               ; GET BACK THE BYTES/WD.
1016:         SUB P,[XWD 3,3]
1017:         JRST @3(P)
    IMPUUO page# 0031 next  prev
1019: ; BUFFERED OUTPUT. GET HERE TO DO A BLT INTO THE MESSAGE BUFFERS.
1020: 
1021: BFOHW:  MOVE TEM,IOS            ; PICK UP BITS PER WORD
1022:         MOVE TEM,BPW(TEM)       ; FROM MAJIK TABLE
1023:         MOVEI AC3,(TEM)
1024:         IMULI AC3,(TAC)         ; AC3 NOW HAS NUMBER OF BITS IN TRANSFER
1025:         CAML AC3,BAL(DDB)       ; IS THIS OVER THE ALLOCATION?
1026:         MOVE AC3,BAL(DDB)       ; YES, ONLY TRANSFER THAT MUCH
1027:         CAILE AC3,=8000         ; MORE THAN THE IMP CAN HANDLE?
1028:         MOVEI AC3,=8000         ; YES, JUST ONE BIT MESSAGE AT A TIME.
1029:         MOVEI UCHN,(AC3)        ; SAVE BITS PER MESSAGE IN UCHN
1030:         IDIVI AC3,(TEM)         ; AC3 IS NOW WORD COUNT OF THIS TRANSFER
1031:         CAME AC1,(P)
1032:         JRST HWNB
1033:         LDB IOS,SIZEP           ; PICK UP BYTE SIZE OF CONNECTION
1034:         IDIVM TEM,IOS           ; GET BYTES PER WORD IN IOS
1035:         IMULI IOS,(AC3)         ; IOS NOW HAS NUMBER OF BYTES IN MESSAGE
1036:         DPB IOS,COUNTP          ; USE THIS AS BYTE COUNT
1037: HWNB:   SETZM TLINK(AC1)        ; CLEAR LINKAGE WORD
1038:         MOVEI AC2,(AC3)
1039:         CAIL AC2,(DAT)          ; MORE WORDS IN XFR THAN IN BUFFER?
1040:         MOVEI AC2,(DAT)         ; YES, TRANSFER WHOLE BUFFER FULL
1041:         PUSHJ P,DOLOC           ; RELOCATE → RESULT IN DSER
1042:         HRLI UCHN,(DSER)        ; AC2 HAS WD CT THIS BUFFER
1043:         CAME AC1,(P)            ; IS THIS THE FIRST BLOCK?
1044:         HRRI UCHN,TDATA(AC1)    ; UCHN IS BLT POINTER
1045:         CAMN AC1,(P)
1046:         HRRI UCHN,TDATA+2(AC1)  ; IS FIRST BLOCK, BUMP POINTER PAST LEADER
1047:         MOVEI UUO,(UCHN)
1048:         ADDI UUO,-1(AC2)
1049:         BLT UCHN,(UUO)
1050:         SUBI AC3,(AC2)          ; BUMP WORD COUNT THIS TRANSFER
1051:         ADDI TAC1,(AC2)         ; ADD IN WORDS IN BLOCK TO USER POINTER
1052:         ADDI DSER,(AC2)
1053:         SUBI TAC,(AC2)          ; DECREMENT WORDS IN ENTIRE OUTPUT
1054:         CAMN AC1,(P)            ; IS THIS THE STARTING BLOCK
1055:         ADDI AC2,2              ; YES, SKIP OVER THE LEADER
1056:         MOVEM AC2,TWC(AC1)      ; SET WORD COUNT INTO BUFFER
1057:         JUMPLE TAC,HWEND        ; IF NONE LEFT, LEAVE
1058:         JUMPLE AC3,HWDOX        ; MORE WDS LEFT, BUT NOT THIS TRANSFER
1059:         MOVE UUO,AC1            ; GET ANOTHER BLOCK
1060:         PUSHJ P,IMPGET
1061:         JRST NOCORE
1062:         SETZM TLINK(AC1)
1063:         HRRZM AC1,TLINK(UUO)    ; LINK US ON TO THE LAST ONE
1064:         MOVE DAT,TLEN(AC1)      ; PICK UP LENGTH OF DATA PORTION OF BUFFER
1065:         MOVEM DAT,TWC(AC1)
1066:         JRST HWNB
    IMPUUO page# 0032 next  prev
1068: ; HERE WE HAVE DECIDED TO SEND THE MESSAGE, WHETHER THERE IS MORE IN THE BUFFER OR NOT
1069: 
1070: 
1071: HWDOX:  POP P,AC1               ; GET BACK ADDRESS OF MESSAGE
1072:         PUSHJ P,UPDALL
1073:         PUSHJ P,UUOQ
1074:         JRST OUTAGN
1075: 
1076: HWEND:  POP P,AC1
1077:         PUSHJ P,UPDALL
1078:         SUB P,[XWD 1,1]         ; SKIP OVER FULL WORD FLAG
1079:         JRST UUOQ
1080: 
1081: ; ROUTINE TO UPDATE THE ALLOCATION FROM THE MESSAGE
1082: 
1083: UPDALL: PUSH P,AC2
1084:         PUSH P,AC3
1085:         LDB AC2,SIZEP
1086:         LDB AC3,COUNTP
1087:         IMULI AC3,(AC2)
1088:         MOVNS AC3
1089:         ADDM AC3,BAL(DDB)
1090:         SOS MAL(DDB)
1091:         POP P,AC3
1092:         POP P,AC2
1093:         POPJ P,
    IMPUUO page# 0033 next  prev
1095: ; IMP INPUT UUOS - BUFFERED MODE AND DUMP MODE
1096: 
1097: BUFI:   HRRZ TAC1,DEVIAD(DDB)   ; PICK UP ADDRESS OF LOSER BUFFER
1098:         XCTR    XR,[HLRZ TAC,(TAC1)]
1099:         ANDCMI TAC,400000
1100:         MOVEI DSER,(TAC1)
1101:         ADDI DSER,-1(TAC)       ; GET ADDRESS OF LAST WORD IN BUFFER IN DSER
1102:         XCTR    XRW,[MOVSS (DSER)]      ; ADDRESS CHECK IT BY GETTIN ILM ON ILLEGAL ADDRESS
1103:         SUBI TAC,1              ; REDUCE WORD COUNT TO SKIP OVER BUFFER HEAD
1104:         ADDI TAC1,2
1105:         PUSHJ P,INPT            ; DO THE INPUT
1106:         JRST ENDCHK             ; ERROR OR EOF
1107:         HRRZ AC2,DEVIAD(DDB)    ; PICK UP BUFFER ADDRESS
1108:         XCTR    XW,[MOVEM DAT,1(AC2)]; SET WORD COUNT IN BUFFER
1109:         PUSHJ P,ADVBFF          ; ADVANCE THE BUFFER
1110:         JRST UUXIT
1111: UUXIT:  MOVE IOS,DEVIOS(DDB)    ; UUOCON EXPECTS THIS
1112:         POPJ P,
1113: 
1114: ENDCHK: TLZE IOS,IOEND          ; DID WE HIT EOF?
1115:         ORI IOS,IODEND          ; YES, SET EOF BIT
1116:         TRNE IOS,TMO            ; TIMED OUT.
1117:         ORI IOS,IODERR          ; YES, GIVE ERROR BIT SO UUOCON WON'T SHIT ON US
1118:         MOVEM IOS,DEVIOS(DDB)
1119:         POPJ P,
1120: 
1121: ; DUMP MODE INPUT
1122: 
1123: DMPI:   PUSHJ P,DMPCMD          ; RETURNS UPLEVEL ON END OF COMMAND LIST
1124:         MOVNS TAC
1125:         XCTR    XRW,[MOVSS (TAC1)]
1126:         MOVEI DSER,(TAC1)
1127:         ADDI DSER,-1(TAC)
1128:         XCTR    XRW,[MOVSS (DSER)]
1129: DMPIT:  PUSHJ P,INPT            ; DO AN INPUT
1130:         JRST ENDCHK
1131:         JUMPG TAC,DMPIT         ; IF WE HAVEN'T GOTTEN WHAT HE ASKED FOR, GO BACK FOR MORE
1132:         AOJA UUO,DMPI           ; CHECK FOR MORE COMMANDS
    IMPUUO page# 0034 next  prev
1134: ; COMMON INPUT ROUTINE.
1135: ; ENTER WITH USER ADDRESS IN TAC1 AND DESIRED WORD COUNT IN TAC
1136: ; RETURNS COUNT OF WORDS TRANSFERRED IN DAT
1137: ; RETURNS +1 IF ERROR OR NO DATA AVAILABLE, +2 ON SOME DATA TRANSFERRED
1138: 
1139: INPT:   PUSHJ P,UUOIOK          ; MAKE SURE HOST ALIVE AND ALL
1140:         POPJ P,                 ; HOST DEAD
1141: INPTM:  SETZ DAT,               ; CLEAR WORD COUNT
1142:         SKIPE AC1,INL(DDB)      ; IS THERE SOME INPUT WAITING FOR US?
1143:         JRST INPT1              ; YES, GO GIVE IT TO LOSER
1144:         MOVE AC1,IMPSTB-1(AC3)  ; PICK UP STATUS BITS
1145:         TLNN AC1,CLSR           ; HAS HE SENT US A CLS?
1146:         JRST INPWT              ; NO, WAIT FOR SOME MORE DATA
1147:         MOVSI IOS,IOEND         ; YES, END OF FILE
1148:         ORB IOS,DEVIOS(DDB)
1149:         POPJ P,
1150: 
1151: INPWT:  PUSHJ P,INIALL          ; CHECK IF INITIAL ALLOCATION DONE YET
1152:         MOVSI IOS,INPW          ; NO, GO INTO INPUT WAIT FOR IT
1153:         ORM IOS,DEVIOS(DDB)
1154:         LDB TEM,INPTP           ; PICK UP INPUT WAIT TIMEOUT
1155:         PUSHJ P,TW              ; WAIT FOR INPUT OR TIMEOUT
1156:         JRST ISETEB             ; LEAVE IF TIMEOUT
1157:         MOVE IOS,DEVIOS(DDB)
1158:         TRNN IOS,TMO!IODERR!IODTER!HDEAD!RSET
1159:         PUSHJ P,UURIDX          ; GET CONNECTION INDEX BACK
1160:         POPJ P,                 ; LEAVE ON ERRORS
1161:         MOVE AC1,IMPSTB-1(AC3)
1162:         TLNN AC1,CLSS!CLSR      ; SEE IF CONNECTION WENT AWAY
1163:         JRST INPT
1164:         SKIPE INL(DDB)          ; DID ANY INPUT SNEAK IN AFTER THE CLOSE?
1165:         JRST INPTOK             ; YES, SET UP CONNECTION INDEX AND INPUT FURTHER
1166:         MOVSI IOS,INPW          ; NO, WAIT FOR MORE INPUT FOR A LITTLE WHILE
1167:         ORM IOS,DEVIOS(DDB)
1168:         LDB TEM,INPTP           ; PICK UP HIS TIMEOUT
1169:         CAIGE TEM,2             ; FOUR SECONDS OR MORE, PLEASE.
1170:         MOVEI TEM,2
1171:         PUSHJ P,TW              ; WAIT
1172:         JFCL                    ; WE WILL TELL THAT NOTHING HAPPENED BY INL BEING EMPTY
1173: INPTOK: PUSHJ P,UURIDX          ; PICK UP CONNECTION INDEX AGAIN
1174:         POPJ P,                 ; NOBODY HOME, LEAVE
1175:         JRST INPTM              ; GOT IT. CHECK INL AGAIN.
1176: 
1177: ISETEB: MOVEI IOS,IODERR                ; SET ERROR BIT SO WE CAN GET OUT OF UUOCON
1178:         ORB IOS,DEVIOS(DDB)
1179:         POPJ P,
    IMPUUO page# 0035 next  prev
1181: ; COMMON INPUT ROUTINE. READ DATA OUT OF INPUT LIST AND INTO USER CORE
1182: 
1183: INPT1:  SKIPGE AC2,TLEN(AC1)    ; HAS THIS LIST BEEN INITIALIZED?
1184:         JRST INPT2              ; YES, GO ON WITH IT
1185:         LDB AC3,SIZEP           ; PICK UP MESSAGE BYTE SIZE
1186:         LDB AC2,COUNTP          ; AND LENGTH OF MESSAGE
1187:         IMULI AC3,(AC2)         ; GET NUMBER OF BITS IN MESSAGE
1188:         MOVNS AC3
1189:         SOS AC2,MIIL(DDB)       ; NOTE ONE LESS MESSAGE IN INPUT LIST
1190:         ADDB AC3,BIIL(DDB)      ; NOTE THAT MANY LESS BITS NOW IN INPUT LIST
1191:         ADD AC2,HMA(DDB)        ; ADD IN HOW MUCH HE HAS NOW
1192:         ADD AC3,HBA(DDB)        ; IN BOTH FLAVORS
1193:         CAMLE AC2,NHMA2(DDB)    ; NOW HAS EITHER ONE DROPPED BELOW HALF THE NOMINAL VALUE
1194:         CAMG AC3,NHBA2(DDB)
1195:         PUSHJ P,SNDBAL          ; GET SOME MORE ALLOCATION
1196:         LDB AC3,SIZEP           ; PICK UP BYTE SIZE OF MESSAGE
1197:         MOVEI AC2,44            ; FIRST GET BYTES/WD IN AC3
1198:         IDIVM AC2,AC3
1199:         LDB AC2,COUNTP          ; NOW GET WDS/THIS MESSAGE
1200:         IDIVI AC2,(AC3)
1201:         SKIPE AC3
1202:         ADDI AC2,1              ; AC2 IS WD CT THIS MESSAGE
1203:         MOVE AC3,TWC(AC1)       ; PICK UP WD CT THIS BLOCK
1204:         SUBI AC3,2              ; SUBTRACT OFF LEADER
1205:         MOVEM AC3,TWC(AC1)
1206:         MOVEI UCHN,(AC1)        ; SAVE BLOCK ADDRESS
1207: COMPTB: CAILE AC2,(AC3)         ; IS WD CT IN MESSAGE LESS THAN WD CT THIS BLOCK?
1208:         JRST GTNXB              ; NO, GO ON TO NEXT BLOCK
1209:         MOVEM AC2,TWC(UCHN)     ; YES, CORRECT IT TO SMALLER VALUE
1210:         PUSH P,AC1
1211:         HRRZ AC1,TLINK(UCHN)    ; NOW GET RID OF ANY SPURIOUS PADDING WHAT MAY BE
1212:         HLLZS TLINK(UCHN)
1213:         SKIPE AC1
1214:         PUSHJ P,RELLST
1215:         POP P,AC1
1216:         MOVEI AC2,TDATA+2(AC1)  ; PICK UP POINTER TO DATA PAST LEADER
1217:         JRST INPT2              ; AND GO ON WITH INPUT
1218: 
1219: GTNXB:  SUBI AC2,(AC3)          ; KNOCK OFF AMOUNT IN THIS BUFFER
1220:         HRRZ UCHN,TLINK(UCHN)   ; AND MOVE ON TO NEXT BUFFER
1221:         JUMPN UCHN,GNXWC
1222:         JSP TAC,UUOMES
1223:         ASCIZ /MESSAGE LENGTH NOT CONSISTANT WITH BYTE SIZE, UUO/
1224: 
1225: GNXWC:  MOVE AC3,TWC(UCHN)      ; PICK UP WC THIS BUFFER
1226:         JRST COMPTB
    IMPUUO page# 0036 next  prev
1228: ; HERE WE HAVE CORRECTED THE WORD COUNTS IN THE BUFFERS AND ARE READY TO DO THE INPUT
1229: 
1230: INPT2:  MOVE AC3,TWC(AC1)       ; PICK UP DATA WORD COUNT
1231:         CAIL AC3,(TAC)          ; DOES THE USER WANT LESS THAN THERE IS?
1232:         MOVEI AC3,(TAC)         ; YES, JUST GIVE HIM WHAT HE WANTS
1233:         PUSHJ P,DOLOC           ; DO SOFTWARE RELOCATION, TAC1 TO DSER
1234:         MOVEI UCHN,(DSER)       ; MAKE UP BLT PTR INTO LOSER CORE
1235:         HRLI DSER,(AC2)
1236:         ADDI UCHN,-1(AC3)
1237:         BLT DSER,(UCHN)
1238:         ADDI AC2,(AC3)          ; BUMP POINTER INTO MESSAGE BUFFER
1239:         ADDI DAT,(AC3)          ; ADD INTO NUMBER OF WORDS TRANSFERRED
1240:         SUBI TAC,(AC3)          ; NOTE THAT HE HAS GOTTEN THAT MANY WORDS
1241:         ADDI TAC1,(AC3)         ; INCREMENT USER ADDRESS
1242:         TLO AC2,400000          ; TURN ON BIT FLAGING PARTIALLY EMPTIED BUFFER
1243:         MOVEM AC2,TLEN(AC1)
1244:         MOVNS AC3               ; DECREMENT COUNT OF WORDS LEFT IN MESSAGE BUFFER
1245:         ADDB AC3,TWC(AC1)
1246:         JUMPG AC3,INPMOR        ; BUFFER NOT EMPTY, SEE IF HE WANTS ANY MORE
1247:         HRRZ UCHN,TLINK(AC1)    ; PICK UP ADDRESS OF NEXT BLOCK IN MESSAGE
1248:         JUMPE UCHN,UNLST        ; IF NONE, END OF LIST
1249:         HLRZ DSER,TLINK(AC1)    ; THERE IS A BLOCK. PASS DOWN CDR POINTER TO IT
1250:         HRLM DSER,TLINK(UCHN)
1251:         HRRM UCHN,INL(DDB)      ; AND MOVE US INTO TOP POSITION
1252:         HLRZ DSER,INL(DDB)      ; ARE WE ALSO THE END?
1253:         CAIN DSER,(AC1)
1254:         HRLM UCHN,INL(DDB)
1255:         PUSHJ P,IMPREL          ; RELEASE THE FREE STORAGE
1256:         MOVE AC1,UCHN
1257:         TLO UCHN,400000         ; SET THE PARTIALLY EMPTY BIT SO WE WON'T TRY TO SKIP OVER THE LEADER
1258:         ADDI UCHN,TDATA         ; SKIP OVER THE OVERHEAD WORDS
1259:         MOVEM UCHN,TLEN(AC1)
1260: INPMOR: JUMPG TAC,INPT1         ; HE WANTS MORE, SEE IF WE CAN GIVE IT TO HIM
1261:         JRST CPOPJ1             ; NO MORE
1262: 
1263: UNLST:  HLRZ UCHN,TLINK(AC1)    ; NO MORE BLOCKS, MOVE TO NEXT MESSAGE
1264:         HRRM UCHN,INL(DDB)
1265:         SKIPN UCHN
1266:         SETZM INL(DDB)
1267:         PUSHJ P,IMPREL
1268:         SKIPE AC1,UCHN
1269:         JRST INPMOR
1270:         SETZM INL(DDB)          ; END OF INPUT LIST
1271:         JRST CPOPJ1
    IMPUUO page# 0037 next  prev
1273: ; CLOSE CODE. DOESN'T REALLY DO MUCH EXCEPT FLUSH BUFFERS AND SEND OUT CLSS
1274: 
1275: CLSO:   SKIPE IMPDEAD
1276:         POPJ P,
1277:         TLNN DDB,OUTBFB!OUTPB   ; OUTPUT BUFFER SET UP?
1278:         JRST CLSO1              ; NO, FORGET ABOUT FLUSHING LAST BUFFER
1279:         LDB AC1,PIOMOD          ; WHAT MODE ARE WE IN?
1280:         CAIGE AC1,DR            ; DUMP MAYBE?
1281:         PUSHJ P,OUT             ; NO, DO LAST OUTPUT FOR BUFFERED MODE
1282: CLSO1:  PUSHJ P,UUSIDX          ; PICK UP LINK TABLE INDEX
1283:         POPJ P,
1284:         MOVE IOS,DEVIOS(DDB)
1285:         TRNE IOS,BLOK           ; IS THERE DATA ON THE LINK?
1286:         PUSHJ P,RFNMWT          ; YES, WAIT FOR IT
1287:         PUSHJ P,UUSIDX
1288:         POPJ P,
1289:         MOVSI AC2,CLSS          ; SEE IF WE HAVE SENT A CLS YET
1290:         TDNE AC2,IMPSTB-1(AC3)
1291:         POPJ P,                 ; YES, ONE IS ENOUGH
1292:         JRST USCLS              ; SEND OUT A SEND-SIDE CLS
1293: 
1294: ; CLOSE INPUT
1295: 
1296: CLSI:   SKIPN IMPDEAD
1297:         PUSHJ P,UURIDX
1298:         POPJ P,
1299:         MOVE IOS,DEVIOS(DDB)
1300:         TRNE IOS,BLOK
1301:         PUSHJ P,RFNMWT
1302:         PUSHJ P,UURIDX
1303:         POPJ P,
1304:         MOVSI AC2,CLSS
1305:         TDNE AC2,IMPSTB-1(AC3)
1306:         POPJ P,
1307:         JRST URCLS              ; SEND OUT A RECEIVE-SIDE CLS
    IMPUUO page# 0038 next  prev
1309: ; UTILITY ROUTINES FOR UUO-LEVEL STUFF. ROUTINES TO SEND STR OR RTS
1310: ; CONNECTION INDEX MUST BE IN AC3
1311: ; POINTER TO USER TABLE MUST BE IN UUO
1312: ; DDB MUST BE SET UP
1313: ; CAN ONLY BE CALLED AT UUO LEVEL BECAUSE IT DOES XCTR'S
1314: 
1315: SNDRFC: HRRZM DDB,IMPDDB-1(AC3)
1316:         PUSHJ P,IMPGET          ; GET SOME FREE STORAGE
1317:         PUSHJ P,CLKWAIT         ; IF AT CLOCK LEVEL, WAIT FOR IT
1318:         XCTR    XR,[MOVE AC2,LSLOC(UUO)]
1319:         MOVEI TEM,RTS           ; WHAT FLAVOR RETURN MESSAGE?
1320:         TRNE AC2,1
1321:         MOVEI TEM,STR           ; SEND SIDE, GIVE HIM A STR INSTEAD
1322:         PUSHJ P,GETIDX          ; PICK UP INDEX OF CONNECTION AGAIN
1323:         JRST NOCONN             ; NONE THERE!
1324:         PUSHJ P,MAKRF
1325:         JRST UUOQ
    IMPUUO page# 0039 next  prev
1327: ; ROUTINE TO MAKE UP AN RFC BLOCK. MUST HAVE BLOCK IN AC1, CONNECTION INDEX IN AC3,
1328: ; OPCODE (STR OR RTS) IN TEM, DEVICE DATA BLOCK ADDRESS IN DDB
1329: 
1330: MAKRF:  MOVSI AC2,RFCS          ; NOTE AN RFC GOING OUT
1331:         PUSHJ P,CSTAT
1332:         PUSHJ P,CLRBLK
1333:         MOVE AC2,LNKTAB-1(AC3)
1334:         ANDCMI AC2,377          ; CONTROL MESSAGES GO OUT ON LINK ZERO
1335:         DPB AC2,ELINKP
1336:         MOVEI AC2,10
1337:         DPB AC2,SIZEP
1338:         MOVEI AC2,12
1339:         DPB AC2,COUNTP
1340:         DPB TEM,OPCDP
1341:         MOVE AC2,IMPLS-1(AC3)
1342:         PUSHJ P,PSOCK1
1343:         MOVE AC2,IMPFS-1(AC3)
1344:         PUSHJ P,PSOCK2
1345:         MOVEI AC2,5
1346:         MOVEM AC2,TWC(AC1)
1347:         CAIE TEM,RTS            ; WHAT FLAVOR?
1348:         JRST SNDBS              ; SEND SIDE, GIVE HIM A BYTE SIZE
1349:         PUSHJ P,GNLNK           ; GET NEW AND UNIQUE LINK NUMBER
1350:         DPB AC2,[POINT 8,LNKTAB-1(AC3),35]
1351:         DPB AC2,SZLKP
1352:         POPJ P,
1353: 
1354: SNDBS:  MOVE AC2,IMPBS-1(AC3)
1355:         DPB AC2,SZLKP
1356:         POPJ P,
    IMPUUO page# 0040 next  prev
1358: ; ERROR ROUTINE FOR NO CONNECTION
1359: 
1360: NOCONN: JSP TAC,UUOMES
1361:         ASCIZ /IMP IO WITHOUT REQUEST FOR CONNECTION
1362: UUO/
1363: 
1364: ; ERROR ROUTINE FOR NO CORE AT UUO LEVEL
1365: 
1366: NOCORE: TELCTR(NNCOR,<NO CORE AT UUO LEVEL>)
1367:         JRST UUOERR
    IMPUUO page# 0041 next  prev
1369: ; ROUTINE TO SEND OUT A MESSAGE AT UUO LEVEL. WAITS FOR
1370: ; LINK TO UNBLOCK IF NEED BE. IF IMP DEAD, RELEASES STORAGE.
1371: ; ENTER WITH MESSAGE IN AC1
1372: 
1373: UUOQ:   SKIPN IMPDEAD           ; IMP DOWN?
1374:         JRST UUODQ              ; NO, GO AHEAD
1375: UUODD:  MOVEI IOS,HDEAD!IODERR  ; YES, GIVE ERROR BITS
1376:         ORB IOS,DEVIOS(DDB)
1377:         JRST RELLST
1378: 
1379: UUODQ:  PUSH P,TAC
1380:         PUSH P,TEM
1381:         LDB TAC,LINKP           ; PICK UP LINK NUMBER
1382:         JUMPE TAC,UUOQ0         ; IF LINK ZERO, CHECK IT SEPARATELY
1383:         MOVE IOS,DEVIOS(DDB)
1384:         TRNN IOS,BLOK           ; ARE WE BLOCKED?
1385:         JRST UUOQNW             ; NO, GO AHEAD
1386:         PUSHJ P,RFNMWT          ; YES, WAIT FOR LINK TO BECOME UNBLOCKED
1387:         TRNE IOS,IODERR!IODTER!HDEAD!RSET
1388:         JRST UUOQRL
1389: UUOQNW: ORI IOS,BLOK            ; NOTE LINK BLOCKED NOW
1390:         MOVEM IOS,DEVIOS(DDB)
1391:         JRST UUOQO
1392: 
1393: UUOQ0:  PUSHJ P,L0PTR           ; MAKE UP POINTER INTO 8-WORD HOST TABLES
1394:         TDNN AC3,L0BLOK(AC2)    ; SEE IF CONTROL LINK BLOCKED
1395:         JRST UUOQ0N             ; NOT BLOCKED, GO AHEAD
1396:         MOVSI IOS,LNK0W         ; NOTE WAITING FOR CONTROL LINK
1397:         ORM IOS,DEVIOS(DDB)
1398:         AOS L0WAIT              ; NOTE ONE MORE WAITOR
1399:         LDB TEM,RFNMTP          ; PICK UP TIME TO WAIT FOR RFNM
1400:         PUSHJ P,TW
1401:         JRST UUOQR1             ;TIMED OUT - CLEAR BIT AND GO AWAY
1402:         MOVE IOS,DEVIOS(DDB)
1403:         TRNN IOS,IODERR!IODTER!HDEAD!RSET
1404:         JRST UUOQ0              ; GO BACK AND CHECK AGAIN
1405: UUOQRL: PUSHJ P,RELLST
1406:         JRST UUOQXT
1407: 
1408: UUOQR1: ANDCAM AC3,L0BLOK(AC2)
1409:         JRST UUOQRL
1410: 
1411: UUOQ0N: ORM AC3,L0BLOK(AC2)     ; NOTE LINK BLOCKED NOW
1412: UUOQO:  PUSHJ P,QOUT            ; SEND MESSAGE OUT
1413: UUOQXT: POP P,TEM
1414:         POP P,TAC
1415:         POPJ P,
    IMPUUO page# 0042 next  prev
1417: ; ROUTINE TO WAIT FOR THE LINK TO CLEAR
1418: ; CALL WITH J, DDB AND IOS SET UP
1419: ; RESTORES IOS, CLOBBERS TEM
1420: 
1421: RFNMWT: SKIPE IMPDEAD
1422:         POPJ P,
1423:         MOVSI IOS,BLOKW
1424:         ORM IOS,DEVIOS(DDB)
1425:         PUSH P,TEM
1426:         LDB TEM,RFNMTP
1427:         PUSHJ P,TW
1428:         JRST [  POP P,TEM
1429:                 SKIPN RECOVER
1430:                 SETOM RECOVER
1431:                 POPJ P,]
1432:         POP P,TEM
1433:         MOVE IOS,DEVIOS(DDB)
1434:         TRNN IOS,HDEAD!RSET!IODERR!IODTER
1435:         TRNN IOS,BLOK
1436:         POPJ P,
1437:         JRST RFNMWT             ; GO BACK AND WAIT SOME MORE
    IMPUUO page# 0043 next  prev
1439: ; ROUTINE TO BLESS UUO LEVEL OUTPUTS BASED ON HOST STATUS.
1440: 
1441: UUOOOK: PUSHJ P,UUSIDX
1442:         POPJ P,
1443:         PUSHJ P,UUOCHK          ; CHECK FOR CONNECTION
1444:         POPJ P,                 ; NONE THERE OR HOST DEAD
1445:         PUSHJ P,UUSIDX          ; GET INDEX INTO LINK TABLE
1446:         JRST NOCONN
1447:         MOVE AC2,IMPSTB-1(AC3)
1448:         TLNN AC2,CLSR           ; HAS HE SENT US A CLS?
1449:         JRST CPOPJ1             ; NO, OUTPUT IS OK
1450:         MOVEI IOS,IODERR        ; YES, ERROR
1451:         ORB IOS,DEVIOS(DDB)
1452:         POPJ P,
1453: 
1454: UUOIOK: PUSHJ P,UURIDX
1455:         POPJ P,
1456:         PUSHJ P,UUOCHK
1457:         POPJ P,
1458:         PUSHJ P,UURIDX          ; PICK UP LINK TABLE INDEX
1459:         JRST NOCONN
1460:         JRST CPOPJ1
    IMPUUO page# 0044 next  prev
1462: ; ROUTINE TO CHECK FOR PROPER CONNECTION AND HOST DEAD.
1463: ; SKIPS ON SUCCESS. FAILURE MEANS EITHER HOST DEAD OR NO CONNECTION.
1464: 
1465: UUOCHK: SKIPE IMPDEAD
1466:         POPJ P,
1467:         MOVE AC2,IMPSTB-1(AC3)
1468:         TLNN AC2,RFCS           ; HAS RFC BEEN SENT?
1469:         JRST NOCONN             ; NO, NOTE CONNECTION NOT OPEN YET
1470:         TLNE AC2,RFCR           ; YES, HAS IT BEEN ACKNOWLEDGED YET?
1471:         JRST CPOPJ1             ; YES, SUCCESS
1472:         MOVSI IOS,RFCW          ; NO, WAIT FOR IT
1473:         ORM IOS,DEVIOS(DDB)
1474:         LDB TEM,RFCTP           ; DON'T WAIT FOR MORE THAN 5 MINUTES
1475:         PUSH P,IMPLS-1(AC3)     ; SAVE SOMETHING SO WE CAN RESET AC3 AFTER TIME WAIT
1476:         PUSHJ P,TW              ; DO A TIMED WAIT
1477:         JRST UUOCHL             ; ERROR RETURN IF TIMEOUT
1478:         POP P,AC2               ; RETRIEVE LOCAL SOCKET NUMBER
1479:         MOVE IOS,DEVIOS(DDB)
1480:         TRNE IOS,IODERR!IODTER
1481:         POPJ P,                 ; LEAVE ON ERROR
1482:         PUSHJ P,GETIDX          ; GET CURRENT AC3 (COULD'VE CHANGED DURING WAIT)
1483:         POPJ P,                 ; ERROR - AC3 NOT ONLY CHANGED, ITS GONE FOREVER!?!?
1484:         JRST UUOCHK             ; GO THROUGH THE LOOP AGAIN
1485: UUOCHL: POP P,AC2
1486:         POPJ P,                 ; ERROR RETURN BECAUSE OF TIMEOUT
1487: 
1488: SETERR: ORI IOS,IODERR          ; SET ERROR BIT
1489:         MOVEM IOS,DEVIOS(DDB)
1490:         POPJ P,
    IMPUUO page# 0045 next  prev
1492: ; ROUTINE TO INITIALIZE A CONNECTION
1493: ; ENTER WITH CONNECTION INDEX IN AC3
1494: ; LOCAL SOCKET NUMBER IN AC2
1495: ; FOREIGN SOCKET NUMBER IN TEM
1496: ; HOST-LINK NUMBER IN DAT
1497: ; POINTER TO USER TABLE IN UUO
1498: 
1499: CLRSKT: MOVEM AC2,IMPLS-1(AC3)  ; SET LOCAL SOCKET NUMBER
1500:         MOVEM TEM,IMPFS-1(AC3)  ; AND FOREIGN SOCKET NUMBER
1501:         MOVEM DAT,LNKTAB-1(AC3) ; AND HOST-LINK NUMBER
1502:         XCTR    XR,[MOVE DAT,BSLOC(UUO)]
1503:         TRNE AC2,1              ;IF A SEND SOCKET, THEN
1504:         MOVEM DAT,IMPBS-1(AC3)  ; SET BYTE SIZE
1505:         SETZM IMPRFQ-1(AC3)
1506:         SETZM IMPSTB-1(AC3)
1507:         HRRZM DDB,IMPDDB-1(AC3)
1508:         POPJ P,
    IMPUUO page# 0046 next  prev
1510: ; ROUTINE TO REQUEUE SOMEONE INTO THE RUN QUEUE
1511: ; ENTER WITH J CONTAINING THE JOB NUMBER
1512: 
1513: QRUN:   LDB J,PJOBN
1514:         SKIPL TIM(DDB)          ; MAKE SURE TIMEOUT IS CLEARED
1515:         SOS TIMWAIT             ; NOTE ONE LESS WAITOR
1516:         SETOM TIM(DDB)
1517:         MOVM DSER,JOBQUE(J)
1518:         CAIE DSER,IOWQ
1519:         POPJ P,
1520:         MOVE DSER,JBTSTS(J)
1521:         TLNN DSER,RUN
1522:         POPJ P,
1523:         MOVNI DSER,RUNQ
1524:         MOVEM DSER,JOBQUE(J)
1525:         JRST REQUE
1526: 
1527: ; ROUTINE TO CHANGE THE STATUS BITS
1528: ; ENTER WITH STATUS BIT TO SET IN AC2
1529: ; CONNECTION INDEX IN AC3
1530: 
1531: CSTAT:  TLO AC2,ANYC
1532:         ORM AC2,IMPSTB-1(AC3)
1533:         PUSH P,DDB
1534:         SKIPN DDB,IMPDDB-1(AC3)
1535:         JRST CSTAT1
1536:         MOVSI AC2,INTIMS
1537:         PUSHJ P,INTCOM
1538: CSTAT1: POP P,DDB
1539:         POPJ P,
1540: 
1541: ; ROUTINE TO GET A CONNECTION INDEX FROM A LOCAL SOCKET NUMBER IN AC2
1542: ; RETURNS INDEX IN AC3
1543: 
1544: GETIDX: SKIPN AC3,FFLNK
1545:         POPJ P,
1546: GETID1: CAMN AC2,IMPLS-1(AC3)
1547:         JRST CPOPJ1
1548:         SOJG AC3,GETID1
1549:         POPJ P,
    IMPUUO page# 0047 next  prev
1551: ; ROUTINE TO WAIT FOR ALLOCATION
1552: 
1553: ALLOCW: SKIPE IMPDEAD
1554:         POPJ P,
1555:         MOVSI IOS,ALLW
1556:         ORM IOS,DEVIOS(DDB)
1557:         PUSH P,TEM
1558:         MOVNI TEM,IOWQ          ; NO INTERNAL TIMEOUT FOR THIS
1559:         MOVEM TEM,JOBQUE(J)
1560:         LDB TEM,ALLTP           ; WE WILL WAIT ONLY SO LONG FOR ALLOCATION
1561:         PUSHJ P,TW
1562:         JRST [  POP P,TEM       ; GET OUR AC BACK
1563:                 JRST ALLXIT]
1564:         POP P,TEM
1565:         MOVE IOS,DEVIOS(DDB)    ; CLEAR ALLOCATION WAIT BIT
1566:         TRNN IOS,IODERR!IODTER!HDEAD!RSET!TMO
1567:         AOS (P)
1568: ALLXIT: MOVSI IOS,ALLW
1569:         ANDCAB IOS,DEVIOS(DDB)
1570:         POPJ P,
1571: 
1572: ; ROUTINE TO CHECK ALLOCATION AND WAIT FOR IT IF NECESSARY
1573: 
1574: ALLOK1: PUSHJ P,ALLOCW          ; NO, WAIT FOR SOME ROOM
1575:         POPJ P,                 ; LEAVE ON ERRORS
1576: ALLOK:  PUSHJ P,UUSIDX          ; PICK UP INDEX INTO LINK TABLE ANEW
1577:         JRST NOCONN             ; NONE THERE! UNTHINKABLE!
1578:         MOVE IOS,IMPSTB-1(AC3)  ; PICK UP STATUS BITS
1579:         TLNE IOS,CLSS!CLSR      ; HAVE WE BEEN CLOSED?
1580:         JRST ALLERS             ; YES, LEAVE NOW, SET ERROR BITS
1581:         MOVE IOS,IMPBS-1(AC3)   ; PICK UP BYTE SIZE
1582:         SKIPLE MAL(DDB)         ; DO WE HAVE ANY MESSAGE ALLOCATION?
1583:         CAMLE IOS,BAL(DDB)      ; IS THERE ROOM FOR AT LEASE ONE BYTE?
1584:         JRST ALLOK1
1585:         JRST CPOPJ1             ; YES, GO AHEAD
1586: 
1587: ALLERS: MOVEI IOS,IODERR
1588:         ORB IOS,DEVIOS(DDB)     ; SET ERROR BITS TO GET THROUGH UUOCON WITHOUT LOSING
1589:         POPJ P,
    IMPUUO page# 0048 next  prev
1591: ; ROUTINE TO GET LINK TABLE INDEX FROM A DDB POINTER - SEND SIDE
1592: 
1593: UUSIDX: SKIPN AC3,FFLNK
1594:         POPJ P,
1595:         PUSH P,DDB
1596:         HRRZ DDB,DDB
1597: UUSID1: MOVE AC2,IMPLS-1(AC3)           ; WHAT GENDER SOCKET
1598:         TRNN AC2,1
1599:         JRST UUSID2
1600:         CAMN DDB,IMPDDB-1(AC3)
1601:         AOSA -1(P)                      ;SUCCESS. SKIP RETURN
1602: UUSID2: SOJG AC3,UUSID1
1603:         POP P,DDB
1604:         POPJ P,
1605: 
1606: ; ROUTINE TO GET LINK TABLE INDEX FROM A DDB POINTER - RECEIVE SIDE
1607: 
1608: UURIDX: SKIPN AC3,FFLNK
1609:         POPJ P,
1610:         PUSH P,DDB
1611:         HRRZ DDB,DDB
1612: UURID1: MOVE AC2,IMPLS-1(AC3)           ; WHAT GENDER SOCKET
1613:         TRNE AC2,1
1614:         JRST UURID2
1615:         CAMN DDB,IMPDDB-1(AC3)
1616:         AOSA -1(P)                      ;SUCCESS
1617: UURID2: SOJG AC3,UURID1
1618:         POP P,DDB
1619:         POPJ P,
    IMPUUO page# 0049 next  prev
1621: ; THIS IS CALLED AT CONNECT AND LISTEN TO DETERMINE
1622: ; IF THERE IS ANOTHER SOCKET OPEN ON THIS DDB, AND IF IT IS
1623: ; NOT THE SEND-RECEIVE MATE, KILL IT WITHOUT TOO MUCH ADO.
1624: ; ENTER WITH SOCKET NUMBER TO BE OPENED IN AC2
1625: 
1626: NSCHECK:
1627:         SKIPN IMPDEAD
1628:         SKIPN AC3,FFLNK
1629:         POPJ P,
1630:         XORI AC2,1              ; PRODUCE THE MATING SOCKET NUMBER
1631:         MOVEI AC1,(DDB)
1632: NSCLOP: CAMN AC1,IMPDDB-1(AC3)  ; IS THIS THE SAME DDB?
1633:         CAMN AC2,IMPLS-1(AC3)   ; YES, IS IT THE APPROPRIATE SOCKET?
1634:         JRST [  SOJG AC3,NSCLOP
1635:                 POPJ P,]
1636:         MOVE AC2,IMPLS-1(AC3)   ; PICK UP THE LOSING SOCKET NUMBER
1637:         MOVE IOS,DEVIOS(DDB)
1638:         TRNE IOS,BLOK
1639:         PUSHJ P,RFNMWT          ; WAIT FOR ANY DATA ON THE LINK TO BO BY
1640:         PUSHJ P,GETIDX          ; GET BACK THE INDEX TO THE STRANGE SOCKET
1641:         POPJ P,
1642:         MOVE AC1,IMPSTB-1(AC3)
1643:         TLNE AC1,RFCS
1644:         TLNE AC1,CLSS
1645:         JRST NSCZLK
1646:         PUSH P,AC2
1647:         PUSHJ P,USCLS
1648:         POP P,AC2
1649:         PUSHJ P,GETIDX
1650:         POPJ P,
1651: NSCZLK: SETZM IMPDDB-1(AC3)
1652:         JRST ZEROLK
    IMPUUO page# 0050 next  prev
1654: ; FREE STORAGE MANAGER FOR IMP SERVICE
1655: 
1656: IMPGET: PUSH P,AC2
1657:         PUSH P,AC3
1658:         MOVEI AC3,TLNG
1659:         PUSHJ P,FSGET
1660:         JRST SCROUNGE
1661:         SKIPG IMPSPN            ; NEED ANY SPARES?
1662:         JRST IMPGSX             ; NO
1663:         PUSH P,AC1              ; YES, SAVE THIS BLOCK AND GET SOME
1664: IMPGE1: MOVEI AC3,TLNG
1665:         PUSHJ P,FSGET
1666:         JRST IMPGX              ; NO MORE, LEAVE WITH THE GOODIES
1667:         CONO PI,IMPOFF
1668:         EXCH AC1,IMPFSL
1669:         HRRZM AC1,@IMPFSL
1670:         CONO PI,IMPON
1671:         SOSLE IMPSPN            ; NOTE ONE LESS BLOCK NEEDED
1672:         JRST IMPGE1             ; IF ANY MORE, GO GET THEM
1673: IMPGX:  POP P,AC1
1674: IMPGSX: HRRZ AC3,-1(AC1)        ; PICK UP POINTER TO TOP OF BLOCK
1675:         HLRZ AC3,(AC3)          ; GET SIZE OF BLOCK
1676:         SUBI AC3,400000+TDATA+2 ; SUBTRACT OFF OVERHEAD WORDS
1677:         MOVEM AC3,TLEN(AC1)     ; PUT THAT AS LENGTH OF BLOCK
1678:         MOVEM AC3,TWC(AC1)      ; AND AS FULL WORD COUNT
1679:         PUSHJ P,LEGAL           ; CHECK IT OUT FIRST
1680:         JRST IMPGET             ; BAD BLOCK, TRY FOR ANOTHER
1681:         AOS -2(P)               ; SET SKIP RETURN
1682:         SETZM TLINK(AC1)        ; CLEAR OUT LINKAGE WORD
1683: IMPGEX: POP P,AC3
1684:         POP P,AC2
1685:         POPJ P,
    IMPUUO page# 0051 next  prev
1687: ; HERE WE CAN'T GET FS FROM THE SYSTEM, SEE IF WE CAN SCROUNGE A BLOCK
1688: 
1689: SCROUNGE:
1690:         CONO PI,IMPOFF
1691:         SKIPN AC1,IMPFSL
1692:         JRST SCRNG1
1693:         MOVE AC3,(AC1)
1694:         MOVEM AC3,IMPFSL
1695:         CONO PI,IMPON
1696:         PUSHJ P,LEGAL           ; IS IT A VALID BLOCK?
1697:         JRST SCRERR             ; NO, FLUSH SPARE LIST
1698:         AOS NSPSUS
1699:         AOS IMPSPN
1700:         JRST IMPGSX
1701: 
1702: SCRERR: SETZM IMPFSL            ; BAD BLOCK, KILL SPARE LIST
1703:         MOVEI AC1,10            ; AND REFILL IT
1704:         MOVEM AC1,IMPSPN
1705:         JRST IMPGEX             ; GIVE ERROR RETURN
1706: 
1707: SCRNG1: CONO PI,IMPON
1708:         JRST IMPGEX
    IMPUUO page# 0052 next  prev
1710: ; ROUTINE TO RELEASE FREE STORAGE
1711: ; REPLENISHES SPARE LIST IF NECESSARY
1712: 
1713: IMPREL: ANDI AC1,-1
1714:         PUSHJ P,LEGAL
1715:         POPJ P,
1716:         SKIPG IMPSPN
1717:         JRST FSGIVE
1718:         SOS IMPSPN
1719:         CONO PI,IMPOFF
1720:         EXCH AC1,IMPFSL
1721:         MOVEM AC1,@IMPFSL
1722:         CONO PI,IMPON
1723:         POPJ P,
1724: 
1725: ; ROUTINE TO CHECK THE LEGALITY OF A FS BLOCK
1726: ; RETURNS +1 IF BLOCK BAD
1727: ; RETURNS +2 IF BLOCK OK
1728: 
1729: LEGAL:  SKIPN DEBMODE           ; ARE WE DEBUGGING?
1730:         JRST CPOPJ1             ; NO, LEAVE IMMEDIATELY
1731:         PUSH P,AC2
1732:         PUSH P,AC3
1733:         HRRZ AC2,-1(AC1)
1734:         HLRZ AC3,(AC2)          ; PICK UP COUNT HALF-WORD
1735:         CAIN AC3,400000+TLNG!7+1
1736:         JRST LEGPCH
1737: LEGERR: PUSHACS
1738:         PUSHJ P,DISDATE
1739:         PUSHJ P,DISERR
1740:         [ASCIZ /BAD BLOCK IN IMPSER
1741: CALLERS = /]
1742:         DISARG LOC,<-22(P)>
1743:         [ASCIZ /, /]
1744:         DISARG LOC,<-23(P)>
1745:         [ASCIZ /, /]
1746:         DISARG LOC,<-24(P)>
1747:         [ASCIZ /, /]
1748:         DISARG LOC,<-25(P)>
1749:         [ASCIZ /
1750: /]
1751:         -1
1752:         POPACS
1753:         POP P,AC3
1754:         POP P,AC2
1755:         POPJ P,
1756: 
1757: LEGPCH: SUBI AC2,TLNG!7+1
1758:         CAIE AC2,-2(AC1)
1759:         JRST LEGERR
1760:         POP P,AC3
1761:         POP P,AC2
1762:         JRST CPOPJ1
    IMPUUO page# 0053 next  prev
1764: ; ROUTINE TO ASSIGN A NEW LINK NUMBER
1765: ; ENTER WITH CONNECTION INDEX IN AC3
1766: ; RETURNS LINK NUMBER IN AC2
1767: 
1768: MAXLNK←←=60
1769: MINLNK←←=10
1770: 
1771: GNLNK:  PUSH P,AC1
1772:         PUSH P,DSER
1773:         MOVE AC2,LSTLNK         ; PICK UP ONE PLUS LAST ASSIGNED LINK NUMBER
1774:         CAIL AC2,MINLNK         ; LESS THAN MINIMUM LINK NUMBER?
1775:         CAILE AC2,MAXLNK-1      ; GREATER THAN MAXIMUM LINK NUMBER?
1776:         MOVEI AC2,MINLNK        ; YES, START AT THE BOTTOM AGAIN
1777:         MOVEM AC2,LSTLNK
1778:         ADDI AC2,1
1779: GNLNK5: SKIPN AC1,FFLNK         ; SCAN DOWN LINK TABLE FOR DUPLICATES
1780:         JRST GNLNK6
1781: GNLNK1: LDB DAT,[POINT 8,LNKTAB-1(AC1),35]
1782:         CAIN DAT,(AC2)          ; SAME LINK?
1783:         JRST GNLNK2             ; YES, SEE IF IT IS THE SAME HOST TOO
1784:         CAMN AC2,LSTLNK         ; HIT OURSELVES YET?
1785:         JRST GNOLNK             ; YES, NO LINK!!!
1786: GNLNK4: SOJG AC1,GNLNK1
1787: GNLNK6: MOVEM AC2,LSTLNK
1788:         POP P,DSER
1789:         POP P,AC1
1790:         POPJ P,
1791: 
1792: GNLNK2: MOVE DSER,LNKTAB-1(AC3)
1793:         XOR DSER,LNKTAB-1(AC1)
1794:         TRNE DSER,177400
1795:         JRST GNLNK4             ; IF DIFFERENT HOSTS, IS OK
1796:         ADDI AC2,1              ; BUMP LINK NUMBER
1797:         CAILE AC2,MAXLNK
1798:         MOVEI AC2,MINLNK
1799:         JRST GNLNK5
1800: 
1801: GNOLNK: TELCTR(NOLKS,<NO NEW LINK!!!>)
1802:         PUSHJ P,DISFLUSH
1803:         JRST AUTOLOAD
    IMPUUO page# 0054 next  prev
1805: ; ROUTINE TO SEE IF A TABLE ENTRY MAY BE CLEARED.
1806: ; ENTER WITH ENTRY INDEX IN AC3
1807: ; IMPDDB-1(AC3) MUST BE ZERO!!!
1808: 
1809: ZEROLK: MOVE AC1,IMPSTB-1(AC3)  ; PICK UP STATUS BITS
1810:         TLNE AC1,RFCR!RFCS      ; ANYTHING HAPPENED ON THE SEND SIDE?
1811:         JRST ZEROL1             ; YES, SEE IF WE HAVE GOTTEN THE CLSS
1812:         TLNE AC1,CLSS           ; HAVE WE SENT A CLS?
1813:         TLNE AC1,CLSR           ; YES, HAVE WE RECEIVED THE MATCHING ONE?
1814:         JRST KILLNK             ; YES, GO TEST THE RECEIVE SIDE
1815:         POPJ P,                 ; NO, DON'T RELEASE SLOT YET
1816: 
1817: ZEROL1: TLNE AC1,CLSS           ; HAVE WE SENT A CLS YET?
1818:         TLNN AC1,CLSR           ; YES, MAKE SURE WE HAVE BOTH SENT AND RECEIVED ONE
1819:         POPJ P,
1820:         JRST KILLNK
    IMPUUO page# 0055 next  prev
1822: ; ROUTINE TO SEARCH DOWN QUEUED RFC LIST FOR AN RFC THAT MATCHES OUR SOCKET
1823: ; UUO LEVEL ONLY. DDB MUST BE SET UP AS WELL AS AC3
1824: 
1825: DISPQ:  SETZ TAC1,              ; PREPARE TO SCAN DOWN QUEUED RFC'S
1826: RFCQL:  PUSHJ P,LEGAL           ; BLESS BLOCK ADDRESS
1827:         JRST [  SETZM IMPRFQ-1(AC3)
1828:                 POPJ P,]        ; GIVE NO FIND RETURN
1829:         PUSHJ P,GSOCK2          ; PICK UP LOCAL SOCKET NUMBER
1830:         CAMN AC2,IMPLS-1(AC3)   ; DOES IT MATCH?
1831:         JRST RFCQD1
1832: RFCQI:  MOVEI TAC1,(AC1)        ; NO, PUT THIS BLOCK AS LAST BLOCK
1833:         HLRZ AC1,TLINK(AC1)     ; PICK UP ADDRESS OF NEXT BLOCK
1834:         JUMPN AC1,RFCQL
1835:         POPJ P,
1836: 
1837: RFCQD1: PUSHJ P,GSOCK1          ; PICK UP FOREIGN SOCKET NUMBER
1838:         CAME AC2,IMPFS-1(AC3)   ; DOES IT MATCH?
1839:         SKIPGE IMPFS-1(AC3)     ; OR IS IT UNUSED?
1840:         JRST RFCQD2
1841:         JRST RFCQI
1842: 
1843: RFCQD2: LDB DAT,ELINKP          ; PICK UP HOST NUMBER
1844:         XOR DAT,LNKTAB-1(AC3)
1845:         TRNE DAT,177400         ; DOES IT MATCH
1846:         SKIPN LNKTAB-1(AC3)     ; OR IS IT OPEN?
1847:         JRST RFCQD3             ; YES, LOAD US UP
1848:         JRST RFCQI
1849: 
1850: RFCQD3: LDB DAT,SRCP            ; PICK UP HOST NUMBER
1851:         DPB DAT,[POINT 8,LNKTAB-1(AC3),27]
1852:         MOVEM AC2,IMPFS-1(AC3)
1853:         LDB AC2,SZLKP           ; PICK UP SIZE-LINK FIELD
1854:         LDB DSER,OPCDP          ; GET OPCODE
1855:         PUSHJ P,SETHB           ; SET LINK NUMBER OR BYTE SIZE
1856:         PUSHJ P,UNLRFQ          ; UNLINK RFC FROM QUEUE
1857:         PUSHJ P,IMPREL          ; AND GIVE IT BACK
1858:         JRST CPOPJ1             ; GIVE SUCCESS RETURN
    IMPUUO page# 0056 next  prev
1860: ; ROUTINE TO APPEND AN ENTIRE RFC QUEUE ONTO ILIST
1861: ; ENTER WITH RFC QUEUE IN AC1 (XWD <LAST>,<FIRST>)
1862: 
1863: APNLST: SETZM IMPRFQ-1(AC3)
1864:         PUSHJ P,LEGAL           ; IS IT A REASONABLE ADDRESS?
1865:         POPJ P,                 ; NO, LEAVE NOW
1866:         CONO PI,IMPOFF
1867:         SKIPN AC2,ILIST
1868:         JRST APNLS1
1869:         MOVSS AC2
1870:         HRLM AC1,TLINK(AC2)
1871:         HLLM AC1,ILIST
1872: APNLS2: CONO PI,IMPON
1873:         POPJ P,
1874: 
1875: APNLS1: MOVEM AC1,ILIST
1876:         JRST APNLS2
1877: 
1878: ; ROUTINE TO UNLINK A RFC FROM THE QUEUED RFC LIST
1879: ; MUST HAVE PREDECESSOR IN TAC1 AND INDEX IN AC3
1880: 
1881: UNLRFQ: HLRZ AC2,TLINK(AC1)
1882:         TRNN TAC1,-1
1883:         JRST UNLRF1
1884:         HRLM AC2,TLINK(TAC1)
1885:         SKIPN AC2
1886:         HRLM TAC1,IMPRFQ-1(AC3)
1887:         POPJ P,
1888: 
1889: UNLRF1: HRRM AC2,IMPRFQ-1(AC3)
1890:         SKIPN AC2
1891:         SETZM IMPRFQ-1(AC3)
1892:         POPJ P,
    IMPUUO page# 0057 next  prev
1894: ; ROUTINE TO GO INTO A WAIT STATE BUT START A COUNTDOWN TOO
1895: ; ENTER WITH WAIT BIT IN IOS, TIME TO WAIT IN TEM
1896: ; SKIPS IF WAIT SATISFIED, DOESN'T SKIP IF TIMED OUT
1897: 
1898: JIFMIN←←=60*JIFSEC
1899: 
1900: TW:     JUMPE TEM,TIMAGN        ; NO TIME MEANS WAIT INDEFINITELY
1901:         IMULI TEM,2*JIFSEC      ; SCALE TO TIX
1902: TIMEDW: ADD TEM,TIME            ; WRAP AROUND
1903:         CAML TEM,[JIFDAY:       =24*=60*JIFMIN]
1904:         SUB TEM,JIFDAY
1905:         MOVEM TEM,TIM(DDB)
1906:         AOS TIMWAIT             ; NOTE THERE IS ANOTHER WAITER
1907: TIMAGN: MOVNI TEM,IOWQ
1908:         MOVEM TEM,JOBQUE(J)
1909:         PUSHJ P,WSCHED
1910:         MOVE TEM,DEVIOS(DDB)
1911:         TDNN TEM,IOS            ; IS THE WAIT SATISFIED?
1912:         JRST TIMXIT             ; YES, LEAVE NORMALLY
1913:         TRNN TEM,TMO!IODERR!IODTER      ; NO, DID WE TIME OUT?
1914:         JRST TIMAGN             ; NO, SPURIOUS WAKEUP (AS IN ↑C - CONT)
1915: TIMXIT: ANDCA IOS,DEVIOS(DDB)   ; CLEAR WAIT BIT
1916:         TRZE IOS,TMO            ; DID WE TIME OUT?
1917:         JRST TIMXT1             ; YES
1918:         AOS (P)                 ; SET SKIP RETURN
1919: TIMXT1: MOVEM IOS,DEVIOS(DDB)
1920:         POPJ P,
    IMPUUO page# 0058 next  prev
1922: ; ROUTINE TO WAIT FOR A MATCHING CLS
1923: ; ENTER WITH CONNECTION INDEX IN AC3
1924: ; RETURNS WITH CONNECTION INDEX IN AC3 AND STATE BITS IN AC1
1925: 
1926: TCLSW:  PUSH P,AC2
1927:         MOVE AC2,IMPLS-1(AC3)
1928:         MOVSI IOS,CLSW
1929:         ORM IOS,DEVIOS(DDB)
1930:         LDB TEM,CLSTP
1931:         PUSHJ P,TW
1932:         JFCL
1933:         PUSHJ P,GETIDX
1934:         JRST NOCONN
1935:         POP P,AC2
1936:         MOVSI AC1,CLSR
1937:         ORB AC1,IMPSTB-1(AC3)
1938:         POPJ P,
    IMPUUO page# 0059 next  prev
1940: ; ROUTINE TO SEND AN ALLOCATION
1941: ; ENTER WITH NUMBER OF BITS OF ALLOCATION HE HAS LEFT IN AC3,
1942: ; AND NUMBER OF MESSAGES HE HAS IN AC2
1943: 
1944: SNDBAL: PUSH P,TAC
1945:         PUSH P,TAC1
1946:         PUSH P,AC1
1947:         MOVNI TAC1,(AC3)        ; PUT BIT ALLOCATION IN TAC1
1948:         ADD TAC1,NHBA(DDB)      ; CONVERT TO NUMBER OF BITS HE NEEDS
1949:         MOVNI TAC,(AC2)         ; AND MESSAGE ALLOCATION IN TAC
1950:         ADD TAC,NHMA(DDB)       ; CONVERT TO NUMBER OF MESSAGES HE NEEDS
1951:         PUSHJ P,IMPGET
1952:         JRST NOCORE
1953:         SETZM TDATA(AC1)
1954:         SETZM TDATA+1(AC1)
1955:         SETZM TDATA+2(AC1)
1956:         PUSHJ P,UURIDX
1957:         JRST NOCONN
1958:         DPB TAC1,[POINT 32,TDATA+3(AC1),31]
1959:         ADDM TAC1,HBA(DDB)      ; INCREMENT BIT ALLOCATION
1960:         DPB TAC,[POINT 16,TDATA+2(AC1),31]
1961:         ADDM TAC,HMA(DDB)       ; ADD THAT IN TO HIS MESSAGE ALLOCATION
1962:         MOVE TAC,IMPSTB-1(AC3)  ; IS THE SOCKET STILL OPEN?
1963:         TLC TAC,RFCS!RFCR       ; MAKE SURE THE SOCKET IS REALLY OPEN
1964:         TLNN TAC,RFCS!RFCR      ; IF NOT, LEAVE NOW
1965:         TLNE TAC,CLSS!CLSR
1966:         JRST SNDPOP             ; NO, DON'T SEND ANY MORE CONTROL COMMANDS
1967:         MOVEI TAC,ALL
1968:         DPB TAC,OPCDP
1969:         MOVE TAC,LNKTAB-1(AC3)
1970:         DPB TAC,OLINKP
1971:         ANDCMI TAC,377
1972:         DPB TAC,ELINKP
1973:         MOVEI TAC,10
1974:         DPB TAC,SIZEP
1975:         DPB TAC,COUNTP
1976:         PUSHJ P,UUOQ
1977: SNDPPX: POP P,AC1
1978:         POP P,TAC1
1979:         POP P,TAC
1980:         POPJ P,
1981: 
1982: SNDPOP: PUSHJ P,IMPREL          ; CONNECTION CLOSED, RELEASE STORAGE AND LEAVE
1983:         JRST SNDPPX
    IMPUUO page# 0060 next  prev
1985: ; ROUTINE TO CHECK AND SEND INITIAL ALLOCATION
1986: ; MUST BE CALLED AT UUO LEVEL ONLY
1987: 
1988: INIALL: SKIPE NHMA(DDB)         ; IS THERE A NOMINAL ALLOCATION YET?
1989:         JRST CHKENF             ; YES, SEE IF IT HAS BEEN SENT YET
1990:         MOVEI AC2,DEFBAL        ; GIVE DEFAULT BIT ALLOCATION
1991:         MOVEM AC2,NHBA(DDB)
1992:         LSH AC2,-1
1993:         MOVEM AC2,NHBA2(DDB)
1994:         MOVEI AC2,DEFMAL        ; AND A BUNCH OF MESSAGES
1995:         MOVEM AC2,NHMA(DDB)
1996:         LSH AC2,-1
1997:         MOVEM AC2,NHMA2(DDB)
1998: CHKENF: MOVE AC3,HBA(DDB)       ; PICK UP CURRENT BIT ALLOCATION
1999:         ADD AC3,BIIL(DDB)       ; ADD IN AMOUNT IN INPUT LIST
2000:         MOVE AC2,HMA(DDB)       ; SAME FOR MESSAGE ALLOCATION
2001:         ADD AC2,MIIL(DDB)
2002:         CAML AC3,NHBA2(DDB)     ; IS BIT ALLOCATION LESS THAN HALF DEPLETED?
2003:         CAMGE AC2,NHMA2(DDB)    ; OR MESSAGE ALLOCATION?
2004:         PUSHJ P,SNDBAL          ; YES, SEND HIM SOME MORE
2005:         POPJ P,
    IMPUUO page# 0061 next  prev
2007: ; ROUTINE TO SEND OUT A SEND-SIDE CLS FROM UUO LEVEL
2008: ; CALL WITH DDB SET UP
2009: 
2010: USCLS:  PUSHJ P,IMPGET
2011:         JRST NOCORE
2012:         PUSHJ P,UUSIDX
2013:         JRST IMPREL
2014:         SETZM BAL(DDB)          ; NOTE NO MORE ALLOCATION
2015:         SETZM MAL(DDB)
2016: USCLS1: MOVE AC2,LNKTAB-1(AC3)
2017:         ANDI AC2,177400
2018:         LSH AC2,14              ; PUT HOST NUMBER IN PROPER SLOT
2019:         PUSHJ P,MCLSB           ; MAKE UP A CLOSE BLOCK
2020:         MOVE AC2,IMPLS-1(AC3)   ; PUT IN OUR SOCKET NUMBER
2021:         PUSH P,AC2              ;SAVE SOCKET NUMBER
2022:         PUSHJ P,PSOCK1
2023:         MOVE AC2,IMPFS-1(AC3)   ; PUT IN HIS SOCKET NUMBER
2024:         PUSHJ P,PSOCK2
2025:         MOVSI AC2,CLSS          ; HAS CLOSE ALREADY BEEN SENT?
2026:         TDNE AC2,IMPSTB-1(AC3)
2027:         JRST [SUB P,[1,,1]
2028:               JRST IMPREL]      ; YES, RELEASE STORAGE AND LEAVE
2029:         PUSHJ P,CSTAT           ; NO, SET CLS SENT BIT
2030:         PUSHJ P,UUOQ            ; AND SEND OUT THE CLS
2031:         POP P,AC2               ;GET BACK SOCKET NUMBER
2032:         PUSHJ P,GETIDX          ;AND INDEX
2033:         JRST NOCONN             ;ARGGGGHHH!!!
2034:         POPJ P,
2035: 
2036: ; RECEIVE SIDE CLS AT UUO LEVEL
2037: ; CALL WITH DDB SET UP
2038: 
2039: URCLS:  PUSHJ P,IMPGET
2040:         JRST NOCORE
2041:         PUSHJ P,UURIDX
2042:         JRST IMPREL
2043:         JRST USCLS1
 EOF: IMPUUO end-of-file. cnt=59